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