Till Westmann has submitted this change and it was merged. Change subject: ASTERIXDB-1785: Remove servlet dependencies ......................................................................
ASTERIXDB-1785: Remove servlet dependencies Change-Id: I12bbd0754755982c95b522a9ade19e9f9690d95a Reviewed-on: https://asterix-gerrit.ics.uci.edu/1484 Reviewed-by: abdullah alamoudi <[email protected]> Sonar-Qube: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> BAD: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> --- M asterixdb/asterix-app/pom.xml M asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java M asterixdb/asterix-client-helper/pom.xml M asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java M asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java M asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java M asterixdb/asterix-common/pom.xml M asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java M asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java M asterixdb/pom.xml M hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml R hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java 12 files changed, 94 insertions(+), 135 deletions(-) Approvals: abdullah alamoudi: Looks good to me, approved Jenkins: Verified; No violations found; No violations found; Verified diff --git a/asterixdb/asterix-app/pom.xml b/asterixdb/asterix-app/pom.xml index 282181c..597e328 100644 --- a/asterixdb/asterix-app/pom.xml +++ b/asterixdb/asterix-app/pom.xml @@ -191,14 +191,6 @@ </build> <dependencies> <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-servlet</artifactId> - </dependency> - <dependency> <groupId>org.apache.hyracks</groupId> <artifactId>hyracks-control-cc</artifactId> </dependency> diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java index 7955ad6..92f3501 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java @@ -25,8 +25,6 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.servlet.Servlet; - import org.apache.asterix.active.ActiveLifecycleListener; import org.apache.asterix.api.http.server.ApiServlet; import org.apache.asterix.api.http.server.ClusterApiServlet; @@ -76,9 +74,7 @@ import org.apache.hyracks.control.common.controllers.CCConfig; import org.apache.hyracks.http.api.IServlet; import org.apache.hyracks.http.server.HttpServer; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.servlet.ServletMapping; +import org.apache.hyracks.http.server.WebManager; public class CCApplicationEntryPoint implements ICCApplicationEntryPoint { @@ -208,7 +204,7 @@ } protected void addLet(HttpServer server, Lets let) { - server.addLet(createServLet(server, let, let.getPath())); + server.addLet(createServlet(server, let, let.getPath())); } protected HttpServer setupQueryWebServer(ExternalProperties externalProperties) throws Exception { @@ -220,15 +216,6 @@ return queryWebServer; } - protected void addServlet(ServletContextHandler context, Servlet servlet, String... paths) { - final ServletHolder holder = new ServletHolder(servlet); - context.getServletHandler().addServlet(holder); - ServletMapping mapping = new ServletMapping(); - mapping.setServletName(holder.getName()); - mapping.setPathSpecs(paths); - context.getServletHandler().addServletMapping(mapping); - } - protected HttpServer setupFeedServer(ExternalProperties externalProperties) throws Exception { HttpServer feedServer = new HttpServer(webManager.getBosses(), webManager.getWorkers(), externalProperties.getFeedServerPort()); @@ -237,7 +224,7 @@ return feedServer; } - protected IServlet createServLet(HttpServer server, Lets key, String... paths) { + protected IServlet createServlet(HttpServer server, Lets key, String... paths) { switch (key) { case AQL: return new FullApiServlet(server.ctx(), paths, ccExtensionManager.getAqlCompilationProvider(), diff --git a/asterixdb/asterix-client-helper/pom.xml b/asterixdb/asterix-client-helper/pom.xml index be9693f..9a7bb64 100644 --- a/asterixdb/asterix-client-helper/pom.xml +++ b/asterixdb/asterix-client-helper/pom.xml @@ -129,7 +129,6 @@ <configuration> <usedDependencies> <usedDependency>org.codehaus.mojo.appassembler:appassembler-booter</usedDependency> - <usedDependency>javax.servlet:javax.servlet-api</usedDependency> </usedDependencies> </configuration> </plugin> @@ -167,10 +166,6 @@ <dependency> <groupId>args4j</groupId> <artifactId>args4j</artifactId> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> </dependency> <dependency> <groupId>org.codehaus.mojo.appassembler</groupId> diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java index e0fcb06..197df25 100644 --- a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java +++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java @@ -22,13 +22,11 @@ import java.net.HttpURLConnection; import java.nio.charset.StandardCharsets; -import javax.servlet.http.HttpServletResponse; +import org.apache.asterix.clienthelper.Args; +import org.apache.commons.io.IOUtils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.asterix.clienthelper.Args; -import org.apache.commons.io.IOUtils; -import com.fasterxml.jackson.databind.node.ObjectNode; public class GetClusterStateCommand extends RemoteCommand { @@ -48,7 +46,7 @@ // 0 = ACTIVE, 1 = DOWN, 2 = UNUSABLE, 3 = OTHER try { conn = openConnection(args.getClusterStatePath(), Method.GET); - if (conn.getResponseCode() == HttpServletResponse.SC_OK) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { String result = IOUtils.toString(conn.getInputStream(), StandardCharsets.UTF_8.name()); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(result); diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java index 688f4ad..8010b39 100644 --- a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java +++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java @@ -19,8 +19,7 @@ package org.apache.asterix.clienthelper.commands; import java.io.IOException; - -import javax.servlet.http.HttpServletResponse; +import java.net.HttpURLConnection; import org.apache.asterix.clienthelper.Args; @@ -46,7 +45,7 @@ int statusCode = tryPost(shutdownPath); // TODO (mblow): interrogate result to determine acceptance, not rely on HTTP 200 switch (statusCode) { - case HttpServletResponse.SC_ACCEPTED: + case HttpURLConnection.HTTP_ACCEPTED: clusterLog("accepted shutdown request."); return 0; case -1: diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java index dad9f8c..96193ce 100644 --- a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java +++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java @@ -23,13 +23,11 @@ import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletResponse; +import org.apache.asterix.clienthelper.Args; +import org.apache.commons.io.IOUtils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.asterix.clienthelper.Args; -import org.apache.commons.io.IOUtils; -import com.fasterxml.jackson.databind.node.ObjectNode; public class WaitForClusterCommand extends RemoteCommand { @@ -41,9 +39,8 @@ @SuppressWarnings("squid:S2142") // interrupted exception public int execute() throws IOException { final int timeoutSecs = args.getTimeoutSecs(); - log("Waiting " - + (timeoutSecs > 0 ? "up to " + timeoutSecs + " seconds " : "") - + "for cluster " + hostPort + " to be available."); + log("Waiting " + (timeoutSecs > 0 ? "up to " + timeoutSecs + " seconds " : "") + "for cluster " + hostPort + + " to be available."); long startTime = System.currentTimeMillis(); long timeoutMillis = TimeUnit.SECONDS.toMillis(timeoutSecs); @@ -65,7 +62,7 @@ HttpURLConnection conn; try { conn = openConnection(args.getClusterStatePath(), Method.GET); - if (conn.getResponseCode() == HttpServletResponse.SC_OK) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { String result = IOUtils.toString(conn.getInputStream(), StandardCharsets.UTF_8.name()); ObjectMapper om = new ObjectMapper(); JsonNode json = om.readTree(result); @@ -79,9 +76,8 @@ // ignore exception, try again } } - log("Cluster " + hostPort + " was not available before timeout of " + timeoutSecs - + " seconds was exhausted" + (lastState != null ? " (state: " + lastState + ")" : "") - + "; check logs for more information"); + log("Cluster " + hostPort + " was not available before timeout of " + timeoutSecs + " seconds was exhausted" + + (lastState != null ? " (state: " + lastState + ")" : "") + "; check logs for more information"); return 1; } } diff --git a/asterixdb/asterix-common/pom.xml b/asterixdb/asterix-common/pom.xml index 731ac14..c2f1c6a 100644 --- a/asterixdb/asterix-common/pom.xml +++ b/asterixdb/asterix-common/pom.xml @@ -264,21 +264,6 @@ <artifactId>log4j</artifactId> </dependency> <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-server</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-servlet</artifactId> - <scope>test</scope> - </dependency> - <dependency> <groupId>com.rometools</groupId> <artifactId>rome</artifactId> <version>1.5.1</version> @@ -300,16 +285,25 @@ <artifactId>guava</artifactId> </dependency> <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>hyracks-data-std</artifactId> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>hyracks-http</artifactId> + </dependency> + <dependency> + <groupId>io.netty</groupId> + <artifactId>netty-all</artifactId> + <version>4.1.6.Final</version> + </dependency> + <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> - </dependency> - <dependency> - <groupId>org.apache.hyracks</groupId> - <artifactId>hyracks-data-std</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java index f025017..6d8e2f2 100644 --- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java +++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java @@ -24,10 +24,14 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ConcurrentMap; +import java.util.logging.Level; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import org.apache.asterix.common.config.GlobalConfig; +import org.apache.hyracks.http.api.IServletRequest; +import org.apache.hyracks.http.api.IServletResponse; +import org.apache.hyracks.http.server.AbstractServlet; +import org.apache.hyracks.http.server.util.ServletUtils; import com.rometools.rome.feed.synd.SyndContent; import com.rometools.rome.feed.synd.SyndContentImpl; @@ -38,9 +42,11 @@ import com.rometools.rome.io.FeedException; import com.rometools.rome.io.SyndFeedOutput; -public class RSSFeedServlet extends HttpServlet { +import io.netty.handler.codec.http.HttpMethod; +import io.netty.handler.codec.http.HttpResponseStatus; - private static final long serialVersionUID = 1L; +public class RSSFeedServlet extends AbstractServlet { + private static final String DEFAULT_FEED_TYPE = "default.feed.type"; private static final String FEED_TYPE = "type"; private static final String MIME_TYPE = "application/xml; charset=UTF-8"; @@ -49,30 +55,45 @@ private static final DateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd"); private String defaultFeedType; - @Override - public void init() { - defaultFeedType = getServletConfig().getInitParameter(DEFAULT_FEED_TYPE); + public RSSFeedServlet(ConcurrentMap<String, Object> ctx, String[] paths) { + super(ctx, paths); + defaultFeedType = (String) ctx.get(DEFAULT_FEED_TYPE); defaultFeedType = (defaultFeedType != null) ? defaultFeedType : "atom_0.3"; } - @Override - public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { + protected void doGet(IServletRequest req, IServletResponse res) throws IOException { try { SyndFeed feed = getFeed(req); String feedType = req.getParameter(FEED_TYPE); feedType = (feedType != null) ? feedType : defaultFeedType; feed.setFeedType(feedType); - res.setContentType(MIME_TYPE); + ServletUtils.setContentType(res, MIME_TYPE); SyndFeedOutput output = new SyndFeedOutput(); - output.output(feed, res.getWriter()); + output.output(feed, res.writer()); } catch (FeedException | ParseException ex) { + GlobalConfig.ASTERIX_LOGGER.log(Level.WARNING, ex.getMessage(), ex); String msg = COULD_NOT_GENERATE_FEED_ERROR; - log(msg, ex); - res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg); + res.writer().print(msg); + res.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); } } - protected SyndFeed getFeed(HttpServletRequest req) throws IOException, FeedException, ParseException { + @Override + public void handle(IServletRequest req, IServletResponse res) { + if (req.getHttpRequest().method() == HttpMethod.GET) { + try { + doGet(req, res); + } catch (IOException e) { + // Servlet methods should not throw exceptions + // http://cwe.mitre.org/data/definitions/600.html + GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e); + } + } else { + res.setStatus(HttpResponseStatus.METHOD_NOT_ALLOWED); + } + } + + protected SyndFeed getFeed(IServletRequest req) throws IOException, FeedException, ParseException { SyndFeed feed = new SyndFeedImpl(); feed.setTitle("Sample Feed (created with ROME)"); feed.setLink("http://rome.dev.java.net"); diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java index 5855e1e..f40999b 100644 --- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java +++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java @@ -18,20 +18,18 @@ */ package org.apache.asterix.test.server; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.apache.hyracks.http.server.HttpServer; +import org.apache.hyracks.http.server.WebManager; public class RSSTestServer implements ITestServer { - private Server rssServer; + private WebManager webManager; public RSSTestServer(int port) { - rssServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - rssServer.setHandler(context); - context.addServlet(new ServletHolder(new RSSFeedServlet()), "/"); + webManager = new WebManager(); + HttpServer rssServer = new HttpServer(webManager.getBosses(), webManager.getWorkers(), port); + rssServer.addLet(new RSSFeedServlet(null, new String[] { "/" })); + webManager.add(rssServer); } @Override @@ -40,13 +38,12 @@ @Override public void start() throws Exception { - rssServer.start(); + webManager.start(); } @Override public void stop() throws Exception { - rssServer.stop(); - rssServer.join(); + webManager.stop(); } } diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml index 3133231..c684539 100644 --- a/asterixdb/pom.xml +++ b/asterixdb/pom.xml @@ -67,7 +67,6 @@ <algebricks.version>0.3.1-SNAPSHOT</algebricks.version> <hyracks.version>0.3.1-SNAPSHOT</hyracks.version> <hadoop.version>2.2.0</hadoop.version> - <jetty.version>9.3.11.v20160721</jetty.version> <jacoco.version>0.7.6.201602180812</jacoco.version> </properties> @@ -652,16 +651,6 @@ <dependencyManagement> <dependencies> <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-server</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-servlet</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> @@ -964,11 +953,6 @@ <artifactId>hyracks-hdfs-2.x</artifactId> <version>${hyracks.version}</version> <type>test-jar</type> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <version>3.1.0</version> </dependency> <dependency> <groupId>commons-io</groupId> diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml index 0b8d6fe..c960da9 100644 --- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml +++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml @@ -77,12 +77,23 @@ <groupId>org.apache.hyracks</groupId> <artifactId>hyracks-control-common</artifactId> <version>${project.version}</version> - <type>jar</type> - <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.1.0</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-http</artifactId> </dependency> <dependency> <groupId>org.apache.wicket</groupId> @@ -96,26 +107,18 @@ </exclusions> </dependency> <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <version>3.1.0</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-servlet</artifactId> - </dependency> - <dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-request</artifactId> <version>1.5.2</version> </dependency> <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-http</artifactId> + <groupId>org.apache.wicket</groupId> + <artifactId>wicket-util</artifactId> + <version>1.5.2</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> </dependency> <dependency> <groupId>org.ini4j</groupId> @@ -126,11 +129,6 @@ <groupId>org.apache.hyracks</groupId> <artifactId>hyracks-ipc</artifactId> <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.wicket</groupId> - <artifactId>wicket-util</artifactId> - <version>1.5.2</version> </dependency> <dependency> <groupId>args4j</groupId> diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/WebManager.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java similarity index 94% rename from asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/WebManager.java rename to hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java index 070a530..235e1ea 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/WebManager.java +++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java @@ -16,12 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.hyracks.bootstrap; +package org.apache.hyracks.http.server; import java.util.ArrayList; import java.util.List; - -import org.apache.hyracks.http.server.HttpServer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; -- To view, visit https://asterix-gerrit.ics.uci.edu/1484 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I12bbd0754755982c95b522a9ade19e9f9690d95a Gerrit-PatchSet: 4 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Till Westmann <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Till Westmann <[email protected]> Gerrit-Reviewer: abdullah alamoudi <[email protected]>
