You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by ja...@apache.org on 2014/11/20 17:44:39 UTC
[03/12] incubator-drill git commit: DRILL-1591,
DRILL-1676: Move javascript resources to local serving and update
dagre-d3 to older version (2.9). Update profile page. Remove references to
invalid servlet api.
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/resources/rest/static/js/respond.min.js
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/resources/rest/static/js/respond.min.js b/exec/java-exec/src/main/resources/rest/static/js/respond.min.js
new file mode 100644
index 0000000..80a7b69
--- /dev/null
+++ b/exec/java-exec/src/main/resources/rest/static/js/respond.min.js
@@ -0,0 +1,5 @@
+/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
+ * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
+ * */
+
+!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:
o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeC
hild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substr
ing(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("
//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/resources/rest/storage/update.ftl
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/resources/rest/storage/update.ftl b/exec/java-exec/src/main/resources/rest/storage/update.ftl
index 1b3316a..2a276e1 100644
--- a/exec/java-exec/src/main/resources/rest/storage/update.ftl
+++ b/exec/java-exec/src/main/resources/rest/storage/update.ftl
@@ -11,7 +11,7 @@
<#include "*/generic.ftl">
<#macro page_head>
- <script src="http://malsup.github.com/jquery.form.js"></script>
+ <script src="/static/js/jquery.form.js"></script>
</#macro>
<#macro page_body>
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/resources/rest/www/drill.ico
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/resources/rest/www/drill.ico b/exec/java-exec/src/main/resources/rest/www/drill.ico
deleted file mode 100644
index 0f9654e..0000000
Binary files a/exec/java-exec/src/main/resources/rest/www/drill.ico and /dev/null differ
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/resources/rest/www/graph.js
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/resources/rest/www/graph.js b/exec/java-exec/src/main/resources/rest/www/graph.js
deleted file mode 100644
index 2d38e63..0000000
--- a/exec/java-exec/src/main/resources/rest/www/graph.js
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * 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.
- */
-
-$(window).load(function () {
- // for each record, unroll the array pointed to by "fieldpath" into a new
- // record for each element of the array
- function unnest (table, fieldpath, dest) {
- var faccess = accessor(fieldpath);
- return $.map(table, function (record, index) {
- var ra = [];
- var nested = faccess(record);
- for (var i = 0; i < nested.length; i++) {
- var newrec = $.extend({}, record);
- newrec[dest] = nested[i];
- ra.push(newrec);
- }
- return ra;
- });
- }
-
- // for each record, project "fieldpath" into "dest".
- function extract (table, fieldpath, dest) {
- var faccess = accessor(fieldpath);
- return $.map(table, function (record, index) {
- var newrec = $.extend({}, record);
- newrec[dest] = faccess(newrec);
- return newrec;
- });
- }
-
- // creates a function that will traverse tree of objects based the '.'
- // delimited "path"
- function accessor (path) {
- path = path.split(".");
- return function (obj) {
- for (var i = 0; i < path.length; i++)
- obj = obj[path[i]];
- return obj;
- }
- }
-
- // sample use of unnest/extract
- function extractminortimes (profile) {
- var t1 = unnest([profile], "fragmentProfile", "ma");
- var t2 = unnest(t1, "ma.minorFragmentProfile", "mi");
-
- var timetable = $.map(t2, function (record, index) {
- var newrec = {
- "name" : record.ma.majorFragmentId + "-" +
- record.mi.minorFragmentId,
- "category" : record.ma.majorFragmentId,
- "start" : (record.mi.startTime - record.start) / 1000.0,
- "end" : (record.mi.endTime - record.start) / 1000.0
- };
- return newrec;
- });
-
- timetable.sort(function (r1, r2) {
- if (r1.category == r2.category) {
- //return r1.name > r2.name;
- return r1.end - r1.start > r2.end - r2.start ? 1 : -1;
- }
- else return r1.category > r2.category ? 1 : -1;
-
- });
- return timetable;
- }
-
- // write the "fieldpaths" for the table "table" into the "domtable"
- function builddomtable (domtable, table, fieldpaths) {
- var faccessors = $.map(fieldpaths, function (d, i) {
- return accessor(d);
- });
-
- var domrow = domtable.append("tr");
- for (var i = 0; i < fieldpaths.length; i++)
- domrow.append("th").text(fieldpaths[i]);
- for (var i = 0; i < table.length; i++) {
- domrow = domtable.append("tr");
- for (var j = 0; j < faccessors.length; j++)
- domrow.append("td").text(faccessors[j](table[i]));
- }
- }
-
- // parse the short physical plan into a dagreeD3 structure
- function parseplan (planstring) {
- var g = new dagreD3.Digraph();
- var ps = $.map(planstring.trim().split("\n"), function (s) {
- return [/^([0-9-]+)( *)([a-zA-Z]*)/.exec(s).slice(1)];
- });
-
- // nodes
- for (var i = 0; i < ps.length; i++) {
- g.addNode(ps[i][0], {
- label: ps[i][2] + " " + ps[i][0],
- fragment: parseInt(ps[i][0].split("-")[0])
- });
- }
-
- // edges
- var st = [ps[0]];
- for (var i = 1; i < ps.length; i++) {
- var top = st.pop();
- while (top[1].length >= ps[i][1].length)
- top = st.pop();
-
- g.addEdge(null, ps[i][0], top[0]);
-
- if (ps[i][1].length != top[1].length)
- st.push(top);
- if (ps[i][1].length >= top[1].length)
- st.push(ps[i]);
- }
- return g;
- }
-
- // graph a "planstring" into the d3 svg handle "svg"
- function buildplangraph (svg, planstring) {
- var padding = 20;
- var graph = parseplan(planstring);
-
- var renderer = new dagreD3.Renderer();
- renderer.zoom(function () {return function (graph, root) {}});
-
- var oldDrawNodes = renderer.drawNodes();
- renderer.drawNodes(function(graph, root) {
- var svgNodes = oldDrawNodes(graph, root);
- svgNodes.each(function(u) {
- var fc = d3.rgb(globalconfig.majorcolorscale(graph.node(u).fragment));
- d3.select(this).select("rect")
- .style("fill", graph.node(u).label.split(" ")[0].endsWith("Exchange") ? "white" : fc)
- .style("stroke", "#000")
- .style("stroke-width", "1px")
- });
- return svgNodes;
- });
-
- var oldDrawEdgePaths = renderer.drawEdgePaths();
- renderer.drawEdgePaths(function(graph, root) {
- var svgEdgePaths = oldDrawEdgePaths(graph, root);
- svgEdgePaths.each(function(u) {
- d3.select(this).select("path")
- .style("fill", "none")
- .style("stroke", "#000")
- .style("stroke-width", "1px")
- });
- return svgEdgePaths;
- });
-
- var shiftedgroup = svg.append("g")
- .attr("transform", "translate(" + padding + "," + padding + ")");
- var layout = dagreD3.layout().nodeSep(20).rankDir("BT");
- var result = renderer.layout(layout).run(graph, shiftedgroup);
-
- svg.attr("width", result.graph().width + 2 * padding)
- .attr("height", result.graph().height + 2 * padding);
- }
-
- function buildtimingchart (svgdest, timetable) {
- var chartprops = {
- "w" : 800,
- "h" : -1,
- "svg" : svgdest,
- "bheight" : 2,
- "bpad" : 0,
- "margin" : 50,
- "scaler" : null,
- "colorer" : null,
- };
-
- chartprops.h = timetable.length * (chartprops.bheight + chartprops.bpad * 2)
-
- chartprops.svg
- .attr("width", chartprops.w + 2 * chartprops.margin)
- .attr("height", chartprops.h + 2 * chartprops.margin)
- .attr("class", "svg");
-
- chartprops.scaler = d3.scale.linear()
- .domain([d3.min(timetable, accessor("start")),
- d3.max(timetable, accessor("end"))])
- .range([0, chartprops.w - chartprops.bpad * 2]);
- chartprops.colorer = globalconfig.majorcolorscale;
-
- // backdrop
- chartprops.svg.append("g")
- .selectAll("rect")
- .data(timetable)
- .enter()
- .append("rect")
- .attr("x", 0)
- .attr("y", function(d, i) {return i * (chartprops.bheight + 2 * chartprops.bpad);})
- .attr("width", chartprops.w)
- .attr("height", chartprops.bheight + chartprops.bpad * 2)
- .attr("stroke", "none")
- .attr("fill", function(d) {return d3.rgb(chartprops.colorer(d.category));})
- .attr("opacity", 0.1)
- .attr("transform", "translate(" + chartprops.margin + "," +
- chartprops.margin + ")");
-
- // bars
- chartprops.svg.append('g')
- .selectAll("rect")
- .data(timetable)
- .enter()
- .append("rect")
- //.attr("rx", 3)
- //.attr("ry", 3)
- .attr("x", function(d) {return chartprops.scaler(d.start) + chartprops.bpad;})
- .attr("y", function(d, i) {return i * (chartprops.bheight + 2 * chartprops.bpad) + chartprops.bpad;})
- .attr("width", function(d) {return (chartprops.scaler(d.end) - chartprops.scaler(d.start));})
- .attr("height", chartprops.bheight)
- .attr("stroke", "none")
- .attr("fill", function(d) {return d3.rgb(chartprops.colorer(d.category));})
- .attr("transform", "translate(" + chartprops.margin + "," +
- chartprops.margin + ")");
-
- // grid lines
- chartprops.svg.append("g")
- .attr("transform", "translate(" +
- (chartprops.bpad + chartprops.margin) + "," +
- (chartprops.h + chartprops.margin) + ")")
- .attr("class", "grid")
- .call(d3.svg.axis()
- .scale(chartprops.scaler)
- .tickSize(-chartprops.h, 0)
- .tickFormat(""))
- .style("stroke", "#000")
- .style("opacity", 0.2);
-
- // ticks
- chartprops.svg.append("g")
- .attr("transform", "translate(" +
- (chartprops.bpad + chartprops.margin) + "," +
- (chartprops.h + chartprops.margin) + ")")
- .attr("class", "grid")
- .call(d3.svg.axis()
- .scale(chartprops.scaler)
- .orient('bottom')
- .tickSize(0, 0)
- .tickFormat(d3.format(".2f")));
- }
-
- function loadprofile (queryid, callback) {
- $.ajax({
- type: "GET",
- dataType: "json",
- url: "/profiles/" + queryid + ".json",
- success: callback,
- error: function (x, y, z) {
- console.log(x);
- console.log(y);
- console.log(z);
- }
- });
- }
-
- function setupglobalconfig (profile) {
- globalconfig.profile = profile;
- globalconfig.majorcolorscale = d3.scale.category20()
- .domain([0, d3.max(profile.fragmentProfile, accessor("majorFragmentId"))]);
-
- }
-
- String.prototype.endsWith = function(suffix) {
- return this.indexOf(suffix, this.length - suffix.length) !== -1;
- };
-
- loadprofile(globalconfig.queryid, function (profile) {
- setupglobalconfig(profile);
-
- var queryvisualdrawn = false;
- var timingoverviewdrawn = false;
- var jsonprofileshown = false;
-
- // trigger svg drawing when visible
- $('#query-tabs').on('shown.bs.tab', function (e) {
- if (queryvisualdrawn || !e.target.href.endsWith("#query-visual")) return;
- buildplangraph(d3.select("#query-visual-canvas"), profile.plan);
- queryvisualdrawn = true;
- })
- $('#fragment-accordion').on('shown.bs.collapse', function (e) {
- if (timingoverviewdrawn || e.target.id != "fragment-overview") return;
- buildtimingchart(d3.select("#fragment-overview-canvas"), extractminortimes(profile));
- timingoverviewdrawn = true;
- });
-
- // select default tabs
- $('#fragment-overview').collapse('show');
- $('#operator-overview').collapse('show');
- $('#query-tabs a[href="#query-query"]').tab('show');
-
-
- // add json profile on click
- $('#full-json-profile-json').on('shown.bs.collapse', function (e) {
- if (jsonprofileshown) return;
- $('#full-json-profile-json').html(JSON.stringify(globalconfig.profile, null, 4));
- });
-
- //builddomtable(d3.select("#timing-table")
- // .append("tbody"), extractminortimes(profile),
- // ["name", "start", "end"]);
- });
-});
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/jdbc/pom.xml
----------------------------------------------------------------------
diff --git a/exec/jdbc/pom.xml b/exec/jdbc/pom.xml
index b707760..c57f18b 100644
--- a/exec/jdbc/pom.xml
+++ b/exec/jdbc/pom.xml
@@ -35,7 +35,7 @@
<artifactId>drill-java-exec</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
+ <dependency>
<groupId>org.apache.drill.contrib.storage-hive</groupId>
<artifactId>drill-storage-hive-core</artifactId>
<version>${project.version}</version>
@@ -99,8 +99,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
- <forkCount>1</forkCount>
- <reuseForks>false</reuseForks>
+ <forkCount>1</forkCount>
+ <reuseForks>false</reuseForks>
</configuration>
</plugin>
<plugin>
@@ -144,6 +144,10 @@
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
+ <exclusion>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>servlet-api-2.5</artifactId>
+ </exclusion>
</exclusions>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 9499ebf..f74ad2b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -164,6 +164,8 @@
<excludeSubprojects>false</excludeSubprojects>
<excludes>
<exclude>**/*.log</exclude>
+ <exclude>**/*.css</exclude>
+ <exclude>**/*.js</exclude>
<exclude>**/*.md</exclude>
<exclude>sandbox/**</exclude>
<exclude>**/*.json</exclude>
@@ -287,7 +289,7 @@
</configuration>
</execution>
<execution>
- <id>no_commons_logging</id>
+ <id>avoid_bad_dependencies</id>
<goals>
<goal>enforce</goal>
</goals>
@@ -296,6 +298,8 @@
<bannedDependencies>
<excludes>
<exclude>commons-logging</exclude>
+ <exclude>javax.servlet:servlet-api</exclude>
+ <exclude>org.mortbay.jetty:servlet-api-2.5</exclude>
</excludes>
</bannedDependencies>
</rules>
@@ -620,6 +624,14 @@
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api-2.5</artifactId>
</exclusion>
+ <exclusion>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>servlet-api-2.5</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
@@ -696,6 +708,10 @@
<version>2.4.1</version>
<exclusions>
<exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ <exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
@@ -955,6 +971,11 @@
<artifactId>servlet-api-2.5</artifactId>
</exclusion>
<exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+
+ <exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
</exclusion>
@@ -1042,6 +1063,10 @@
<artifactId>servlet-api-2.5</artifactId>
</exclusion>
<exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ <exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
</exclusion>
@@ -1186,6 +1211,10 @@
<version>0.94.17-mapr-1405-m7-4.0.1</version>
<exclusions>
<exclusion>
+ <artifactId>servlet-api-2.5</artifactId>
+ <groupId>org.mortbay.jetty</groupId>
+ </exclusion>
+ <exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
@@ -1282,6 +1311,10 @@
<version>2.3.0-cdh5.0.3</version>
<exclusions>
<exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ <exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
@@ -1336,6 +1369,10 @@
<version>2.4.0.2.1.3.0-563</version>
<exclusions>
<exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ <exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>