Author: [email protected]
Date: Tue Jan 31 18:58:46 2012
New Revision: 2047

Log:
AMDATU-529 Refactor Web parameter resolver / Removed dummy itest / Added 
resolver tests

Added:
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/HostnameTenantResolverTest.java
      - copied, changed from r2046, 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/BenchmarkTest.java
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/ParameterTenantResolverTest.java
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TenantResolverServlet.java
      - copied, changed from r2046, 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/BenchMarkServlet.java
   
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/ParameterTenantResolverConstants.java
      - copied, changed from r2046, 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TestServiceImpl.java
   
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/osgi/Activator.java
      - copied, changed from r2046, 
/trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/osgi/ParameterTenantResolverActivator.java
   
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/service/ParameterTenantMappingRegistry.java
Modified:
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/BenchmarkTest.java
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/WebTest.java
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/BenchMarkServlet.java
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TestService.java
   
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TestServiceImpl.java
   trunk/amdatu-web/tenantresolver-parameter/pom.xml
   
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/osgi/ParameterTenantResolverActivator.java
   
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/service/ParameterTenantResolverExtenderFilter.java

Modified: 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/BenchmarkTest.java
==============================================================================
--- 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/BenchmarkTest.java
    (original)
+++ 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/BenchmarkTest.java
    Tue Jan 31 18:58:46 2012
@@ -53,6 +53,8 @@
 
 /**
  * Simple benchmark used to compare basic HTTP service performance changes.
+ * 
+ * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
  */
 @RunWith(JUnit4TestRunner.class)
 @ExamReactorStrategy(EagerSingleStagedReactorFactory.class)
@@ -97,8 +99,8 @@
             .setImplementation(m_benchmarkServlet)
             .add(
                 dm.createServiceDependency()
-                     .setService(DispatcherService.class)
-                     .setRequired(true));
+                    .setService(DispatcherService.class)
+                    .setRequired(true));
 
         dm.add(m_benchmarkComponent);
         m_testContext.getService(Servlet.class, "(" + 
DispatcherService.ALIAS_KEY + "=" + SERV_PATH + ")");

Copied: 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/HostnameTenantResolverTest.java
 (from r2046, 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/BenchmarkTest.java)
==============================================================================
--- 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/BenchmarkTest.java
   (original)
+++ 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/HostnameTenantResolverTest.java
       Tue Jan 31 18:58:46 2012
@@ -1,148 +1,166 @@
-/*
- * Copyright (c) 2010, 2011 The Amdatu Foundation
- * 
- * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.amdatu.web.itest.tests;
-
-import static org.ops4j.pax.exam.CoreOptions.options;
-
-import java.io.BufferedInputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import javax.inject.Inject;
-import javax.servlet.Servlet;
-
-import org.amdatu.core.itest.base.CoreBundles;
-import org.amdatu.core.itest.base.CoreConfigs;
-import org.amdatu.core.itest.base.TestContext;
-import org.amdatu.web.dispatcher.DispatcherService;
-import org.amdatu.web.itest.base.WebBundles;
-import org.amdatu.web.itest.base.WebConfigs;
-import org.amdatu.web.itest.tests.mock.BenchMarkServlet;
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.DependencyManager;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.CoreOptions;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.Configuration;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactorFactory;
-import org.osgi.framework.BundleContext;
-
-/**
- * Simple benchmark used to compare basic HTTP service performance changes.
- */
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(EagerSingleStagedReactorFactory.class)
-public class BenchmarkTest {
-
-    private final static int NR_SAMPLES = 40000;
-    private final static int NR_THREADS = 40;
-    private final static String RES_CONTENT = "Hello World";
-    private final static String SERV_PATH = "/benchmark";
-
-    @Inject
-    private static BundleContext m_bundleContext;
-    private TestContext m_testContext;
-    private BenchMarkServlet m_benchmarkServlet;
-    private Component m_benchmarkComponent;
-    private String m_port;
-
-    @Configuration
-    public Option[] config() {
-        return options(
-            CoreOptions.junitBundles(),
-            CoreBundles.provisionAllExcluding(),
-            
WebBundles.provisionAllExcluding(WebBundles.TENANTRESOLVER_PARAMETER));
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        m_testContext = new TestContext(m_bundleContext);
-        CoreConfigs.provisionAllExcluding(m_testContext, CoreConfigs.TENANT);
-        WebConfigs.provisionAll(m_testContext);
-
-        m_port =
-            (String) 
m_testContext.getConfigurationAdmin().getConfiguration("org.osgi.service.http").getProperties()
-                .get("org.osgi.service.http.port");
-
-        DependencyManager dm = m_testContext.getDependencyManager();
-        Dictionary<String, Object> properties = new Hashtable<String, 
Object>();
-        properties.put(DispatcherService.ALIAS_KEY, SERV_PATH);
-        m_benchmarkServlet = new BenchMarkServlet(RES_CONTENT);
-        m_benchmarkComponent = dm.createComponent()
-            .setInterface(Servlet.class.getName(), properties)
-            .setImplementation(m_benchmarkServlet)
-            .add(
-                dm.createServiceDependency()
-                     .setService(DispatcherService.class)
-                     .setRequired(true));
-
-        dm.add(m_benchmarkComponent);
-        m_testContext.getService(Servlet.class, "(" + 
DispatcherService.ALIAS_KEY + "=" + SERV_PATH + ")");
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        DependencyManager dm = m_testContext.getDependencyManager();
-        dm.remove(m_benchmarkComponent);
-        m_testContext.tearDown();
-    }
-
-    @Test
-    public void testBenchmark() throws Exception {
-
-        final ExecutorService exe = Executors.newFixedThreadPool(NR_THREADS);
-        final CountDownLatch lat = new CountDownLatch(NR_SAMPLES);
-
-        for (int i = 0; i < NR_SAMPLES; i++) {
-            exe.submit(new Runnable() {
-                public void run() {
-                    try {
-                        StringBuilder res = new StringBuilder();
-                        URL url = new URL("http://localhost:"; + m_port + 
SERV_PATH);
-                        InputStreamReader isr = new InputStreamReader(new 
BufferedInputStream(url.openStream()));
-                        int c = isr.read();
-                        while (c != -1) {
-                            res.append((char) c);
-                            c = isr.read();
-                        }
-                        isr.close();
-                        Assert.assertEquals(RES_CONTENT, res.toString());
-                    }
-                    catch (Throwable e) {
-                        e.printStackTrace();
-                    }
-                    finally {
-                        lat.countDown();
-                    }
-                }
-            });
-        }
-        lat.await();
-        exe.shutdown();
-        Assert.assertEquals(NR_SAMPLES, m_benchmarkServlet.getDoGetCount());
-    }
-}
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ * 
+ * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.amdatu.web.itest.tests;
+
+import static org.ops4j.pax.exam.CoreOptions.options;
+
+import java.io.BufferedInputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.inject.Inject;
+import javax.servlet.Servlet;
+
+import org.amdatu.core.itest.base.CoreBundles;
+import org.amdatu.core.itest.base.CoreConfigs;
+import org.amdatu.core.itest.base.TestContext;
+import org.amdatu.tenant.TenantConstants;
+import org.amdatu.web.dispatcher.DispatcherService;
+import org.amdatu.web.itest.base.WebBundles;
+import org.amdatu.web.itest.base.WebConfigs;
+import org.amdatu.web.itest.tests.mock.TenantResolverServlet;
+import org.amdatu.web.tenantresolver.hostname.HostNameTenantResolverConstants;
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.CoreOptions;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.ExamReactorStrategy;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactorFactory;
+import org.osgi.framework.BundleContext;
+
+/**
+ * 
+ * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
+ */
+@RunWith(JUnit4TestRunner.class)
+@ExamReactorStrategy(EagerSingleStagedReactorFactory.class)
+public class HostnameTenantResolverTest {
+
+    private final static String SERV_PATH = "/test";
+    private final static String TNT_LOCALHOST = "tenant.localhost";
+
+    @Inject
+    private static BundleContext m_bundleContext;
+    private TestContext m_testContext;
+    private TenantResolverServlet m_tenantResolverServlet;
+    private Component m_tenantResolverComponent;
+    private String m_port;
+
+    @Configuration
+    public Option[] config() {
+        return options(
+            CoreOptions.junitBundles(),
+            CoreBundles.provisionAllExcluding(),
+            
WebBundles.provisionAllExcluding(WebBundles.TENANTRESOLVER_PARAMETER));
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        m_testContext = new TestContext(m_bundleContext);
+        CoreConfigs.provisionAllExcluding(m_testContext, CoreConfigs.TENANT);
+        WebConfigs.provisionAllExcluding(m_testContext, WebConfigs.TENANT);
+
+        // get port from configuration
+        m_port =
+            (String) 
m_testContext.getConfigurationAdmin().getConfiguration("org.osgi.service.http").getProperties()
+                .get("org.osgi.service.http.port");
+
+        // configure a tenant
+        Properties tenantProps = new Properties();
+        tenantProps.put(TenantConstants.PID_KEY, TNT_LOCALHOST);
+        tenantProps.put(TenantConstants.NAME_KEY, "Some tenant at localhost");
+        tenantProps.put(HostNameTenantResolverConstants.HOSTNAMES_KEY, new 
String[] { "localhost" });
+        m_testContext.updateFactoryConfig("org.amdatu.tenant.factory", 
tenantProps);
+
+        // register a servlet
+        DependencyManager dm = m_testContext.getDependencyManager();
+        Dictionary<String, Object> properties = new Hashtable<String, 
Object>();
+        properties.put(DispatcherService.ALIAS_KEY, SERV_PATH);
+        m_tenantResolverServlet = new TenantResolverServlet();
+        m_tenantResolverComponent = dm.createComponent()
+            .setInterface(Servlet.class.getName(), properties)
+            .setImplementation(m_tenantResolverServlet)
+            .add(
+                dm.createServiceDependency()
+                    .setService(DispatcherService.class)
+                    .setRequired(true));
+
+        dm.add(m_tenantResolverComponent);
+        m_testContext.waitForSystemToSettle();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        DependencyManager dm = m_testContext.getDependencyManager();
+        dm.remove(m_tenantResolverComponent);
+        m_testContext.tearDown();
+    }
+
+    @Test
+    public void testTenantResolvesAtLocalhost() throws Exception {
+        executeRequest("http://localhost:"; + m_port + SERV_PATH);
+        Assert.assertTrue("Expected tenant to resolve at localhost", 
m_tenantResolverServlet.getLastTenant() != null
+            && 
m_tenantResolverServlet.getLastTenant().getId().equals(TNT_LOCALHOST));
+    }
+
+    @Test
+    public void testTenantDoesNotResolveAt127001() throws Exception {
+        executeRequest("http://127.0.0.1:"; + m_port + SERV_PATH);
+        Assert.assertTrue("Expected tenant not to resolve at 127.0.0.1",
+            m_tenantResolverServlet.getLastTenant() == null);
+    }
+
+    private void executeRequest(final String getUrl) throws Exception {
+        final ExecutorService exe = Executors.newSingleThreadExecutor();
+        final CountDownLatch latch = new CountDownLatch(1);
+        exe.submit(new Runnable() {
+            public void run() {
+                try {
+                    StringBuilder res = new StringBuilder();
+                    URL url = new URL(getUrl);
+                    InputStreamReader isr = new InputStreamReader(new 
BufferedInputStream(url.openStream()));
+                    int c = isr.read();
+                    while (c != -1) {
+                        res.append((char) c);
+                        c = isr.read();
+                    }
+                    isr.close();
+                }
+                catch (Throwable e) {
+                    e.printStackTrace();
+                }
+                finally {
+                    latch.countDown();
+                }
+            }
+        });
+        latch.await();
+        exe.shutdown();
+    }
+}

Added: 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/ParameterTenantResolverTest.java
==============================================================================
--- (empty file)
+++ 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/ParameterTenantResolverTest.java
      Tue Jan 31 18:58:46 2012
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ * 
+ * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.amdatu.web.itest.tests;
+
+import static org.ops4j.pax.exam.CoreOptions.options;
+
+import java.io.BufferedInputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.inject.Inject;
+import javax.servlet.Servlet;
+
+import org.amdatu.core.itest.base.CoreBundles;
+import org.amdatu.core.itest.base.CoreConfigs;
+import org.amdatu.core.itest.base.TestContext;
+import org.amdatu.tenant.TenantConstants;
+import org.amdatu.web.dispatcher.DispatcherService;
+import org.amdatu.web.itest.base.WebBundles;
+import org.amdatu.web.itest.base.WebConfigs;
+import org.amdatu.web.itest.tests.mock.TenantResolverServlet;
+import org.amdatu.web.tenantresolver.hostname.HostNameTenantResolverConstants;
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.CoreOptions;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.ExamReactorStrategy;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactorFactory;
+import org.osgi.framework.BundleContext;
+
+/**
+ * 
+ * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
+ */
+@RunWith(JUnit4TestRunner.class)
+@ExamReactorStrategy(EagerSingleStagedReactorFactory.class)
+public class ParameterTenantResolverTest {
+
+    private final static String SERV_HOST = "localhost";
+    private final static String SERV_PATH = "/test";
+
+    private final static String TNT_KNOWN = "tenant.known";
+    private final static String TNT_UNKNOWN = "tenant.unknown";
+
+    @Inject
+    private static BundleContext m_bundleContext;
+    private TestContext m_testContext;
+    private TenantResolverServlet m_tenantResolverServlet;
+    private Component m_tenantResolverComponent;
+    private String m_port;
+
+    @Configuration
+    public Option[] config() {
+        return options(
+            CoreOptions.junitBundles(),
+            CoreBundles.provisionAllExcluding(),
+            
WebBundles.provisionAllExcluding(WebBundles.TENANTRESOLVER_HOSTNAME));
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        m_testContext = new TestContext(m_bundleContext);
+        CoreConfigs.provisionAllExcluding(m_testContext, CoreConfigs.TENANT);
+        WebConfigs.provisionAllExcluding(m_testContext, WebConfigs.TENANT);
+
+        // get port from configuration
+        m_port =
+            (String) 
m_testContext.getConfigurationAdmin().getConfiguration("org.osgi.service.http").getProperties()
+                .get("org.osgi.service.http.port");
+
+        // configure a tenant
+        Properties tenantProps = new Properties();
+        tenantProps.put(TenantConstants.PID_KEY, TNT_KNOWN);
+        tenantProps.put(TenantConstants.NAME_KEY, "Some tenant");
+        tenantProps.put(HostNameTenantResolverConstants.HOSTNAMES_KEY, new 
String[] { "localhost" });
+        m_testContext.updateFactoryConfig("org.amdatu.tenant.factory", 
tenantProps);
+
+        // register a servlet
+        DependencyManager dm = m_testContext.getDependencyManager();
+        Dictionary<String, Object> properties = new Hashtable<String, 
Object>();
+        properties.put(DispatcherService.ALIAS_KEY, SERV_PATH);
+        m_tenantResolverServlet = new TenantResolverServlet();
+        m_tenantResolverComponent = dm.createComponent()
+            .setInterface(Servlet.class.getName(), properties)
+            .setImplementation(m_tenantResolverServlet)
+            .add(
+                dm.createServiceDependency()
+                    .setService(DispatcherService.class)
+                    .setRequired(true));
+
+        dm.add(m_tenantResolverComponent);
+        m_testContext.waitForSystemToSettle();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        DependencyManager dm = m_testContext.getDependencyManager();
+        dm.remove(m_tenantResolverComponent);
+        m_testContext.tearDown();
+    }
+
+    @Test
+    public void testRegisteredTenantResolves() throws Exception {
+        executeRequest("http://"; + SERV_HOST + ":" + m_port + SERV_PATH + 
"?tenant=" + TNT_KNOWN);
+        Assert.assertTrue("Expected tenant resolved to " + TNT_KNOWN, 
m_tenantResolverServlet.getLastTenant() != null
+            && 
m_tenantResolverServlet.getLastTenant().getId().equals(TNT_KNOWN));
+    }
+
+    @Test
+    public void testUnregisteredTenantDoesNotResolve() throws Exception {
+        executeRequest("http://"; + SERV_HOST + ":" + m_port + SERV_PATH + 
"?tenant=" + TNT_UNKNOWN);
+        Assert.assertTrue("Expected tenant not to resolve " + TNT_UNKNOWN,
+            m_tenantResolverServlet.getLastTenant() == null);
+    }
+
+    private void executeRequest(final String getUrl) throws Exception {
+        final ExecutorService exe = Executors.newSingleThreadExecutor();
+        final CountDownLatch latch = new CountDownLatch(1);
+        exe.submit(new Runnable() {
+            public void run() {
+                try {
+                    StringBuilder res = new StringBuilder();
+                    URL url = new URL(getUrl);
+                    InputStreamReader isr = new InputStreamReader(new 
BufferedInputStream(url.openStream()));
+                    int c = isr.read();
+                    while (c != -1) {
+                        res.append((char) c);
+                        c = isr.read();
+                    }
+                    isr.close();
+                }
+                catch (Throwable e) {
+                    e.printStackTrace();
+                }
+                finally {
+                    latch.countDown();
+                }
+            }
+        });
+        latch.await();
+        exe.shutdown();
+    }
+}

Modified: 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/BenchMarkServlet.java
==============================================================================
--- 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/BenchMarkServlet.java
    (original)
+++ 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/BenchMarkServlet.java
    Tue Jan 31 18:58:46 2012
@@ -26,6 +26,8 @@
 
 /**
  * Simple integration test servlet that counts invocations.
+ * 
+ * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
  */
 public class BenchMarkServlet extends HttpServlet {
 

Copied: 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TenantResolverServlet.java
 (from r2046, 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/BenchMarkServlet.java)
==============================================================================
--- 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/BenchMarkServlet.java
   (original)
+++ 
trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TenantResolverServlet.java
       Tue Jan 31 18:58:46 2012
@@ -1,52 +1,50 @@
-/*
- * Copyright (c) 2010, 2011 The Amdatu Foundation
- * 
- * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.amdatu.web.itest.tests.mock;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Simple integration test servlet that counts invocations.
- */
-public class BenchMarkServlet extends HttpServlet {
-
-    private final String m_returnMessage;
-    private volatile AtomicInteger m_doGetCount = new AtomicInteger();
-
-    public BenchMarkServlet(String returnMessage) {
-        m_returnMessage = returnMessage;
-    }
-
-    public int getDoGetCount() {
-        return m_doGetCount.intValue();
-    }
-
-    @Override
-    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
-
-        m_doGetCount.incrementAndGet();
-        resp.setContentType("text/plain");
-        PrintWriter pw = resp.getWriter();
-        pw.append(m_returnMessage);
-        pw.close();
-    }
-}
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ * 
+ * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.amdatu.web.itest.tests.mock;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.amdatu.tenant.Tenant;
+import org.amdatu.web.dispatcher.DispatcherService;
+
+/**
+ * Simple integration test servlet that remembers last tenant
+ * 
+ * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
+ */
+public class TenantResolverServlet extends HttpServlet {
+
+    private volatile Tenant m_tenant;
+
+    public Tenant getLastTenant() {
+        return m_tenant;
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
+        m_tenant = (Tenant) 
req.getAttribute(DispatcherService.TENANT_REQUESTCONTEXT_KEY);
+        resp.setContentType("text/plain");
+        PrintWriter pw = resp.getWriter();
+        pw.append("OK");
+        pw.close();
+    }
+}

Modified: trunk/amdatu-web/tenantresolver-parameter/pom.xml
==============================================================================
--- trunk/amdatu-web/tenantresolver-parameter/pom.xml   (original)
+++ trunk/amdatu-web/tenantresolver-parameter/pom.xml   Tue Jan 31 18:58:46 2012
@@ -52,7 +52,7 @@
         <configuration>
           <instructions>
             <Private-Package> 
org.amdatu.web.tenantresolver.parameter.*</Private-Package>
-            
<Bundle-Activator>org.amdatu.web.tenantresolver.parameter.osgi.ParameterTenantResolverActivator</Bundle-Activator>
+            
<Bundle-Activator>org.amdatu.web.tenantresolver.parameter.osgi.Activator</Bundle-Activator>
             
<Bundle-SymbolicName>org.amdatu.web.tenantresolver.parameter</Bundle-SymbolicName>
             <Export-Package>
               org.amdatu.web.tenantresolver.parameter;version=1.0.0

Copied: 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/ParameterTenantResolverConstants.java
 (from r2046, 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TestServiceImpl.java)
==============================================================================
--- 
/trunk/amdatu-web/itest/tests/src/test/java/org/amdatu/web/itest/tests/mock/TestServiceImpl.java
    (original)
+++ 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/ParameterTenantResolverConstants.java
       Tue Jan 31 18:58:46 2012
@@ -1,31 +1,24 @@
-/*
- * Copyright (c) 2010, 2011 The Amdatu Foundation
- * 
- * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.amdatu.web.itest.tests.mock;
-
-public class TestServiceImpl implements TestService {
-
-    public void init() {
-    }
-
-    public void start() {
-    }
-
-    public void stop() {
-    }
-
-    public void destroy() {
-    }
-}
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ * 
+ * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.amdatu.web.tenantresolver.parameter;
+
+/**
+ * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
+ * 
+ */
+public interface ParameterTenantResolverConstants {
+    String HOSTNAMES_KEY = "org.amdatu.tenantresolver.parameter";
+}
\ No newline at end of file

Copied: 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/osgi/Activator.java
 (from r2046, 
/trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/osgi/ParameterTenantResolverActivator.java)
==============================================================================
--- 
/trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/osgi/ParameterTenantResolverActivator.java
 (original)
+++ 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/osgi/Activator.java
 Tue Jan 31 18:58:46 2012
@@ -18,8 +18,10 @@
 import java.util.Dictionary;
 import java.util.Hashtable;
 
+import org.amdatu.tenant.Tenant;
 import org.amdatu.web.dispatcher.DispatchExtenderFilter;
 import org.amdatu.web.dispatcher.DispatcherService;
+import 
org.amdatu.web.tenantresolver.parameter.service.ParameterTenantMappingRegistry;
 import 
org.amdatu.web.tenantresolver.parameter.service.ParameterTenantResolverExtenderFilter;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
@@ -33,26 +35,29 @@
  * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
  * 
  */
-public final class ParameterTenantResolverActivator extends 
DependencyActivatorBase {
+public final class Activator extends DependencyActivatorBase {
 
     @Override
     public void init(BundleContext context, DependencyManager manager) throws 
Exception {
 
+        ParameterTenantMappingRegistry registry = new 
ParameterTenantMappingRegistry();
+        ParameterTenantResolverExtenderFilter filter = new 
ParameterTenantResolverExtenderFilter(registry);
+
         Dictionary<String, Object> thProperties = new Hashtable<String, 
Object>();
         thProperties.put(Constants.SERVICE_RANKING, 0);
         thProperties.put(DispatcherService.PATTERN_KEY, ".*");
         manager.add(
-                createComponent()
-                    .setInterface(DispatchExtenderFilter.class.getName(), 
thProperties)
-                    
.setImplementation(ParameterTenantResolverExtenderFilter.class)
-                    // Guards filter lifecycle
-                    .add(createServiceDependency()
-                               .setService(DispatcherService.class)
-                               .setRequired(true))
-                    .add(createServiceDependency()
-                               .setService(LogService.class)
-                               .setRequired(false))
-                       );
+            createComponent()
+                .setInterface(DispatchExtenderFilter.class.getName(), 
thProperties)
+                .setImplementation(filter)
+                .add(createServiceDependency()
+                    .setService(Tenant.class)
+                    .setRequired(false)
+                    .setCallbacks(registry, "addTenant", "removeTenant"))
+                .add(createServiceDependency()
+                    .setService(LogService.class)
+                    .setRequired(false))
+            );
     }
 
     @Override

Added: 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/service/ParameterTenantMappingRegistry.java
==============================================================================
--- (empty file)
+++ 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/service/ParameterTenantMappingRegistry.java
 Tue Jan 31 18:58:46 2012
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ * 
+ * Licensed 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.amdatu.web.tenantresolver.parameter.service;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.amdatu.tenant.Tenant;
+
+/**
+ * 
+ * TODO document
+ * TODO check for duplicates
+ * TODO test
+ * 
+ * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
+ * 
+ */
+public final class ParameterTenantMappingRegistry {
+
+    // maps fast hostname lookup
+    private final Map<String, Tenant> m_idToTenant =
+        new ConcurrentHashMap<String, Tenant>();
+
+    public Tenant getTenant(String tenantId) {
+        return m_idToTenant.get(tenantId);
+    }
+
+    public void removeTenant(Tenant tenant) {
+        m_idToTenant.remove(tenant.getId());
+    }
+
+    public void addTenant(Tenant tenant) {
+        m_idToTenant.put(tenant.getId(), tenant);
+    }
+}
\ No newline at end of file

Modified: 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/service/ParameterTenantResolverExtenderFilter.java
==============================================================================
--- 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/service/ParameterTenantResolverExtenderFilter.java
  (original)
+++ 
trunk/amdatu-web/tenantresolver-parameter/src/main/java/org/amdatu/web/tenantresolver/parameter/service/ParameterTenantResolverExtenderFilter.java
  Tue Jan 31 18:58:46 2012
@@ -25,12 +25,8 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.amdatu.tenant.Tenant;
-import org.amdatu.tenant.TenantConstants;
 import org.amdatu.web.dispatcher.DispatchExtenderFilter;
 import org.amdatu.web.dispatcher.DispatcherService;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
 import org.osgi.service.log.LogService;
 
 /**
@@ -45,8 +41,13 @@
 
     public final static String TENANT_REQUEST_PARAMETER = "tenant";
 
+    private final ParameterTenantMappingRegistry m_registry;
+
     private volatile LogService m_logService;
-    private volatile BundleContext m_bundleContext;
+
+    public 
ParameterTenantResolverExtenderFilter(ParameterTenantMappingRegistry registry) {
+        m_registry = registry;
+    }
 
     public void init(FilterConfig filterConfig) throws ServletException {
     }
@@ -57,35 +58,22 @@
     public void doFilter(ServletRequest servletRequest, ServletResponse 
servletResponse, FilterChain filterChain)
         throws IOException, ServletException {
 
-        final HttpServletRequest httpServletRequest = (HttpServletRequest) 
servletRequest;
-        final String tenantId = 
httpServletRequest.getParameter(TENANT_REQUEST_PARAMETER);
-        boolean resolved = false;
+        HttpServletRequest httpServletRequest = (HttpServletRequest) 
servletRequest;
+        String tenantId = 
httpServletRequest.getParameter(TENANT_REQUEST_PARAMETER);
 
-        // TODO should check value for a valid format to prevent invalid filter
         if (tenantId != null) {
-            try {
-                ServiceReference[] refs =
-                    
m_bundleContext.getServiceReferences(Tenant.class.getName(), "(" + 
TenantConstants.PID_KEY
-                        + "=" + tenantId + ")");
-                if (refs != null && refs.length > 0) {
-                    Tenant tenant = (Tenant) 
m_bundleContext.getService(refs[0]);
-                    if (tenant != null) {
-                        
servletRequest.setAttribute(DispatcherService.TENANT_REQUESTCONTEXT_KEY, 
tenant);
-                        
servletRequest.setAttribute(DispatcherService.TENANTID_REQUESTCONTEXT_KEY, 
tenant.getId());
-                        resolved = true;
-                    }
-                }
+            Tenant tenant = m_registry.getTenant(tenantId);
+            if (tenant != null) {
+                
servletRequest.setAttribute(DispatcherService.TENANT_REQUESTCONTEXT_KEY, 
tenant);
+                
servletRequest.setAttribute(DispatcherService.TENANTID_REQUESTCONTEXT_KEY, 
tenant.getId());
             }
-            catch (InvalidSyntaxException e) {
-                m_logService.log(LogService.LOG_ERROR, "Illegal filter in 
servicelookup... should never happen!", e);
-                throw new ServletException("Illegal filter in servicelookup... 
should never happen!", e);
+            else {
+                // No INF/WARN/ERR cause there may be multiple resolvers in 
play
+                m_logService.log(LogService.LOG_DEBUG,
+                    "Failed to resolved request to available tenant for 
request value: "
+                        + tenantId);
             }
         }
-        if (!resolved) {
-            // No INF/WARN/ERR cause there may be multiple resolvers in play
-            m_logService.log(LogService.LOG_DEBUG, "Failed to resolved request 
to available tenant for request value: "
-                + tenantId);
-        }
         filterChain.doFilter(servletRequest, servletResponse);
     }
 }
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to