You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2009/03/13 19:02:34 UTC
svn commit: r753333 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/
rt/frontend/jaxrs/src/test/java...
Author: sergeyb
Date: Fri Mar 13 18:02:21 2009
New Revision: 753333
URL: http://svn.apache.org/viewvc?rev=753333&view=rev
Log:
JAXRS : enhancing XMLSource, adding omitted JAXRSClientFactoryBeanTest
Added:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java (with props)
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java (with props)
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java (with props)
Removed:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/XMLSource.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/XMLSourceTest.java
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=753333&r1=753332&r2=753333&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Fri Mar 13 18:02:21 2009
@@ -121,7 +121,8 @@
return context != null ? context : getClassContext(type);
}
- private JAXBContext getClassContext(Class<?> type) throws JAXBException {
+ // TODO : move this method to a dedicated JAXBContextRegistry class
+ public JAXBContext getClassContext(Class<?> type) throws JAXBException {
synchronized (classContexts) {
JAXBContext context = classContexts.get(type);
if (context == null) {
@@ -132,7 +133,8 @@
}
}
- protected JAXBContext getPackageContext(Class<?> type) {
+ // TODO : move this method to a dedicated JAXBContextRegistry class
+ public JAXBContext getPackageContext(Class<?> type) {
if (type == null) {
return null;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java?rev=753333&r1=753332&r2=753333&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java Fri Mar 13 18:02:21 2009
@@ -45,7 +45,7 @@
import org.w3c.dom.Document;
-import org.apache.cxf.jaxrs.client.XMLSource;
+import org.apache.cxf.jaxrs.utils.XMLSource;
@Provider
@Produces({"application/xml", "text/xml" })
Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java?rev=753333&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java Fri Mar 13 18:02:21 2009
@@ -0,0 +1,190 @@
+/**
+ * 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 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.apache.cxf.jaxrs.utils;
+
+import java.io.InputStream;
+import java.lang.reflect.Array;
+import java.net.URI;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.xml.sax.InputSource;
+
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
+
+/**
+ * Utiliity class for manipulating XML response using XPath and XSLT
+ *
+ */
+public class XMLSource {
+
+ private static final String XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
+
+ private InputSource source;
+ private RuntimeException exceptionToThrow;
+
+ public XMLSource(InputStream is) {
+ source = new InputSource(is);
+ }
+
+ public void setException(RuntimeException ex) {
+ exceptionToThrow = ex;
+ }
+
+ public <T> T getNode(String expression, Class<T> cls) {
+ return getNode(expression, CastUtils.cast(Collections.emptyMap(), String.class, String.class), cls);
+ }
+
+ public <T> T getNode(String expression, Map<String, String> namespaces, Class<T> cls) {
+ XPath xpath = XPathFactory.newInstance().newXPath();
+ xpath.setNamespaceContext(new NamespaceContextImpl(namespaces));
+ try {
+ Node node = (Node)xpath.evaluate(expression, source, XPathConstants.NODE);
+ if (node == null) {
+ if (exceptionToThrow != null) {
+ throw exceptionToThrow;
+ }
+ return null;
+ }
+ DOMSource ds = new DOMSource(node);
+ return readFromSource(ds, cls);
+ } catch (XPathExpressionException ex) {
+ throw new IllegalArgumentException("Illegal XPath expression '" + expression + "'", ex);
+ }
+ }
+
+ public <T> T[] getNodes(String expression, Class<T> cls) {
+ return getNodes(expression, CastUtils.cast(Collections.emptyMap(), String.class, String.class), cls);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T[] getNodes(String expression, Map<String, String> namespaces, Class<T> cls) {
+ XPath xpath = XPathFactory.newInstance().newXPath();
+ xpath.setNamespaceContext(new NamespaceContextImpl(namespaces));
+ try {
+ NodeList nodes = (NodeList)xpath.evaluate(expression, source, XPathConstants.NODESET);
+ if (nodes == null || nodes.getLength() == 0) {
+ if (exceptionToThrow != null) {
+ throw exceptionToThrow;
+ }
+ return null;
+ }
+ T[] values = (T[])Array.newInstance(cls, nodes.getLength());
+
+ for (int i = 0; i < nodes.getLength(); i++) {
+ DOMSource ds = new DOMSource(nodes.item(i));
+ values[i] = readFromSource(ds, cls);
+ }
+
+ return values;
+
+ } catch (XPathExpressionException ex) {
+ throw new IllegalArgumentException("Illegal XPath expression '" + expression + "'", ex);
+ }
+ }
+
+ public URI getLink(String expression) {
+ return getLink(expression, CastUtils.cast(Collections.emptyMap(), String.class, String.class));
+ }
+
+ public URI getLink(String expression, Map<String, String> namespaces) {
+ String value = getValue(expression, namespaces);
+ return value == null ? null : URI.create(value);
+ }
+
+ public URI getBaseURI() {
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("xml", XML_NAMESPACE);
+ return getLink("/*/@xml:base", map);
+ }
+
+ public String getValue(String expression) {
+ return getValue(expression, CastUtils.cast(Collections.emptyMap(), String.class, String.class));
+ }
+
+ public String getValue(String expression, Map<String, String> namespaces) {
+ XPath xpath = XPathFactory.newInstance().newXPath();
+ xpath.setNamespaceContext(new NamespaceContextImpl(namespaces));
+ try {
+ return (String)xpath.evaluate(expression, source, XPathConstants.STRING);
+ } catch (XPathExpressionException ex) {
+ throw new IllegalArgumentException("Illegal XPath expression '" + expression + "'", ex);
+ }
+ }
+
+ private static class NamespaceContextImpl implements NamespaceContext {
+
+ private Map<String, String> namespaces;
+
+ public NamespaceContextImpl(Map<String, String> namespaces) {
+ this.namespaces = namespaces;
+ }
+
+ public String getNamespaceURI(String prefix) {
+ return namespaces.get(prefix);
+ }
+
+ public String getPrefix(String namespace) {
+ for (Map.Entry<String, String> entry : namespaces.entrySet()) {
+ if (entry.getValue().equals(namespace)) {
+ return entry.getKey();
+ }
+ }
+ return null;
+ }
+
+ public Iterator getPrefixes(String namespace) {
+ String prefix = namespaces.get(namespace);
+ if (prefix == null) {
+ return null;
+ }
+ return Collections.singletonList(prefix).iterator();
+ }
+ }
+
+ private <T> T readFromSource(Source s, Class<T> cls) {
+ try {
+ JAXBElementProvider provider = new JAXBElementProvider();
+ JAXBContext c = provider.getPackageContext(cls);
+ if (c == null) {
+ c = provider.getClassContext(cls);
+ }
+ Unmarshaller u = c.createUnmarshaller();
+ return cls.cast(u.unmarshal(s));
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java?rev=753333&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java Fri Mar 13 18:02:21 2009
@@ -0,0 +1,71 @@
+/**
+ * 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 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.apache.cxf.jaxrs.client;
+
+import org.apache.cxf.jaxrs.resources.BookStore;
+import org.apache.cxf.jaxrs.resources.BookStoreSubresourcesOnly;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JAXRSClientFactoryBeanTest extends Assert {
+
+ @Test
+ public void testCreateClient() throws Exception {
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress("http://bar");
+ bean.setResourceClass(BookStore.class);
+ assertTrue(bean.create() instanceof BookStore);
+ }
+
+ @Test
+ public void testTemplateInRootPathInherit() throws Exception {
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress("http://bar");
+ bean.setResourceClass(BookStoreSubresourcesOnly.class);
+ BookStoreSubresourcesOnly store = bean.create(BookStoreSubresourcesOnly.class, 1, 2, 3);
+ BookStoreSubresourcesOnly store2 = store.getItself();
+ assertEquals("http://bar/bookstore/1/2/3/sub1",
+ WebClient.client(store2).getCurrentURI().toString());
+ }
+
+ @Test
+ public void testTemplateInRootReplace() throws Exception {
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress("http://bar");
+ bean.setResourceClass(BookStoreSubresourcesOnly.class);
+ BookStoreSubresourcesOnly store = bean.create(BookStoreSubresourcesOnly.class, 1, 2, 3);
+ BookStoreSubresourcesOnly store2 = store.getItself2("11", "33");
+ assertEquals("http://bar/bookstore/11/2/33/sub2",
+ WebClient.client(store2).getCurrentURI().toString());
+ }
+
+ @Test
+ public void testTemplateInRootAppend() throws Exception {
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress("http://bar");
+ bean.setResourceClass(BookStoreSubresourcesOnly.class);
+ BookStoreSubresourcesOnly store = bean.create(BookStoreSubresourcesOnly.class, 1, 2, 3);
+ BookStoreSubresourcesOnly store2 = store.getItself3("id4");
+ assertEquals("http://bar/bookstore/1/2/3/id4/sub3",
+ WebClient.client(store2).getCurrentURI().toString());
+ }
+
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java?rev=753333&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java Fri Mar 13 18:02:21 2009
@@ -0,0 +1,145 @@
+/**
+ * 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 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.apache.cxf.jaxrs.utils;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class XMLSourceTest extends Assert {
+
+ @Test
+ public void testGetNodeNoNamespace() {
+ InputStream is = new ByteArrayInputStream("<foo><bar/></foo>".getBytes());
+ XMLSource xp = new XMLSource(is);
+ Bar bar = xp.getNode("/foo/bar", Bar.class);
+ assertNotNull(bar);
+ }
+
+ @Test
+ public void testGetNodeNamespace() {
+ String data = "<x:foo xmlns:x=\"http://baz\"><x:bar/></x:foo>";
+ InputStream is = new ByteArrayInputStream(data.getBytes());
+ XMLSource xp = new XMLSource(is);
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("x", "http://baz");
+ Bar2 bar = xp.getNode("/x:foo/x:bar", map, Bar2.class);
+ assertNotNull(bar);
+ }
+
+ @Test
+ public void testGetNodeNamespace2() {
+ String data = "<z:foo xmlns:z=\"http://baz\"><z:bar/></z:foo>";
+ InputStream is = new ByteArrayInputStream(data.getBytes());
+ XMLSource xp = new XMLSource(is);
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("x", "http://baz");
+ Bar2 bar = xp.getNode("/x:foo/x:bar", map, Bar2.class);
+ assertNotNull(bar);
+ }
+
+ @Test
+ public void testGetNodeNamespace3() {
+ String data = "<x:foo xmlns:x=\"http://foo\" xmlns:z=\"http://baz\"><z:bar/></x:foo>";
+ InputStream is = new ByteArrayInputStream(data.getBytes());
+ XMLSource xp = new XMLSource(is);
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("x", "http://foo");
+ map.put("y", "http://baz");
+ Bar2 bar = xp.getNode("/x:foo/y:bar", map, Bar2.class);
+ assertNotNull(bar);
+ }
+
+ @Test
+ public void testGetNodeDefaultNamespace() {
+ String data = "<foo xmlns=\"http://baz\"><bar/></foo>";
+ InputStream is = new ByteArrayInputStream(data.getBytes());
+ XMLSource xp = new XMLSource(is);
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("x", "http://baz");
+ Bar2 bar = xp.getNode("/x:foo/x:bar", map, Bar2.class);
+ assertNotNull(bar);
+ }
+
+ @Test
+ public void testGetNodesNoNamespace() {
+ InputStream is = new ByteArrayInputStream("<foo><bar/><bar/></foo>".getBytes());
+ XMLSource xp = new XMLSource(is);
+ Bar[] bars = xp.getNodes("/foo/bar", Bar.class);
+ assertNotNull(bars);
+ assertEquals(2, bars.length);
+ assertNotSame(bars[0], bars[1]);
+ }
+
+ @Test
+ public void testGetNodesNamespace() {
+ String data = "<x:foo xmlns:x=\"http://baz\"><x:bar/><x:bar/></x:foo>";
+ InputStream is = new ByteArrayInputStream(data.getBytes());
+ XMLSource xp = new XMLSource(is);
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("x", "http://baz");
+ Bar2[] bars = xp.getNodes("/x:foo/x:bar", map, Bar2.class);
+ assertNotNull(bars);
+ assertNotNull(bars);
+ assertEquals(2, bars.length);
+ assertNotSame(bars[0], bars[1]);
+ }
+
+ @Test
+ public void testGetStringValue() {
+ InputStream is = new ByteArrayInputStream("<foo><bar/><bar id=\"2\"/></foo>".getBytes());
+ XMLSource xp = new XMLSource(is);
+ String value = xp.getValue("/foo/bar/@id");
+ assertEquals("2", value);
+ }
+
+ @Test
+ public void testGetRelativeLink() {
+ InputStream is = new ByteArrayInputStream("<foo><bar/><bar href=\"/2\"/></foo>".getBytes());
+ XMLSource xp = new XMLSource(is);
+ URI value = xp.getLink("/foo/bar/@href");
+ assertEquals("/2", value.toString());
+ }
+
+ @Test
+ public void testBaseURI() {
+ InputStream is = new ByteArrayInputStream(
+ "<foo xml:base=\"http://bar\"><bar/><bar href=\"/2\"/></foo>".getBytes());
+ XMLSource xp = new XMLSource(is);
+ URI value = xp.getBaseURI();
+ assertEquals("http://bar", value.toString());
+ }
+
+ @XmlRootElement
+ private static class Bar {
+
+ }
+
+ @XmlRootElement(name = "bar", namespace = "http://baz")
+ private static class Bar2 {
+
+ }
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=753333&r1=753332&r2=753333&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Fri Mar 13 18:02:21 2009
@@ -44,9 +44,9 @@
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.cxf.jaxrs.client.ResponseExceptionMapper;
import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.jaxrs.client.XMLSource;
import org.apache.cxf.jaxrs.ext.form.Form;
import org.apache.cxf.jaxrs.impl.MetadataMap;
+import org.apache.cxf.jaxrs.utils.XMLSource;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
import org.junit.BeforeClass;