Merge branch 'master' of ssh://sapsailing.com/home/trac/git into bug4104

# Conflicts:
#	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
This commit is contained in:
Henri Kohlberg committed 2018-09-03 11:24:41 +02:00
commit cace306d0f
230 files changed
+6892 -4037

No files matched your search

+12 -4
View File
@@ -18,7 +18,7 @@ BACKUP_DIRECTORIES="/etc /var/log/mongodb"
PREFIX="database"
# Directory for temporary files
TARGET_DIR=/var/lib/mysql/backup
TARGET_DIR=/var/lib/mongodb/backup
# Configuration for MongoDB backup
MONGO_PORTS="10202 10201"
@@ -26,7 +26,7 @@ MONGO_INSTALLATION=/opt/mongodb-linux-x86_64-2.6.7
MONGO_CMD=$MONGO_INSTALLATION/bin/mongo
MONGOEXPORT_CMD=$MONGO_INSTALLATION/bin/mongoexport
MONGODB_COLLECTION_WIND="WIND_TRACKS"
MONGODB_COLLECTION_LOCAL="local"
MONGODB_EXCLUDE_DBS="local 29erWorlds2016 29erWorlds2016-replica 49er-n17-euros2017 49er-n17-euros2017-replica 49erEuros2015 49erEuros2016 49erEuros2016-replica 49erJWC2015 49erWorlds_2016 49erWorlds_2016-replica 49erWorlds_2016-replica2 49erWorlds_2016-replica3 49erworlds2015 505-2017 505-2017-replica 505-2017-replica-1 505-2017-replica-2 505Worlds2016 505Worlds2016-replica 505_WORLDS_2015 6mworlds2017 6mworlds2017-replica 8MWORLDS2017 8MWORLDS2017-replica AustrianLeague2015 Bodenseewoche_2015 Championsleague_2015 Championsleague_2015-Replica DANISHLEAGUE2017 DANISHLEAGUE2017-replica DUTCH_LEAGUE_2017 DUTCH_LEAGUE_2017-replica DanishSailingLeague_2015 DutchSailingLeague_2015 FinnishSailingLeague_2015 GermanSailingLeague_2015 GermanSailingLeague_2015-Replica HANSESAIL2017 IDMFINN2017 KW2015 KW2015-replica KW2015-replica2 KW2017 KW2017-replica Norwegianleague_2015 POLISHLEAGUE2017 RosAtomCup_2015 SAPOPTICUP2015 SCL2017 SCL2017-replica SGCN_Smartphone_2016 SGCN_Smartphone_2016-replica SPEEDSAILING2016 SWC2016-Melbourne SWC2016-Melbourne-replica SWC2016-Qingdao SWC2016-Qingdao-replica SWC2017-Aarhus SWC2017-HYERES SWC2017-HYERES-replica SWC2017-Miami SWC2017-Miami-replica SWC2017-SANTANDER SWC2017-SANTANDER-replica SWEDISHLEAGUE2017 SWEDISHLEAGUE2017-replica TW2015 TW2015-REPLICA TW2015-test-replica TW2017 TW2017-replica WORLDCUPSYLT2015 YES2015 YES2015-REPLICA YES2015-REPLICA2 allsvenskan2015 austrianleague2016 austrianleague2017 bartsbash2015 bundesliga2-2017 bundesliga2-2017-replica bundesliga2016 bundesliga2016-replica bundesliga2016_2 bundesliga2017 bundesliga2017-replica crw2016 crw2016-replica danishleague2016 danishleague2016-replica dsl-pokal2017 dutchleague2016 dutchleague2016-replica ess2015 ess2016 ess2017 ess2017_foiling_test ess40-2015-replica2 finnishleague2016 finnishleague2017 forumvostok2016 frenchleague2017 germanleague2016-replica idmstar2016 isafwc2014 kielerwoche2016 kielerwoche2016-replica kiellauf2017 northsearegatta2017 northstreamrace2017 norwegianleague2016 norwegianleague2016-replica norwegianleague2017 norwegianleague2017-replica rsc2016 scl2016 scl2016-replica swedishleague2016 swedishleague2016-replica tw2016 tw2016-replica usoda2016 wmrt2016"
# Configuration for MySQL
MYSQL_DATABASES="bugs mysql"
@@ -40,7 +40,8 @@ BACKUP_SERVER="backup@172.31.25.136"
BACKUP_DATE=`date +%s`
# Aliases
BUP_CMD="/opt/bup/bup"
BUP_DIR=/var/lib/mongodb/backup/bup
BUP_CMD="/opt/bup/bup -d $BUP_DIR"
BUP_ADDITIONAL="-r $BACKUP_SERVER:/home/backup/$PREFIX"
BUP_IGNORES='--exclude-rx=/war/$'
BUP_CMD_INDEX="$BUP_CMD index $BUP_IGNORES"
@@ -92,7 +93,14 @@ show collections" | $MONGO_CMD --port $MONGO_PORT | tail -n +4 | grep -v "^syste
else
DB_DIR=$TARGET_DIR/mongodb-$MONGO_PORT$WIND_SUFFIX
fi
if [ "$i" != "$MONGODB_COLLECTION_LOCAL" -a \( "$i" != "$MONGODB_COLLECTION_WIND" -o "$PARAM" = "weekly" \) ]; then
exclude=0
for exclude_collection in $MONGODB_EXCLUDE_DBS; do
if [ "$i" = "$exclude_collection" ]; then
echo "Excluding $i from backup based on exclude list"
exclude=1
fi
done
if [ "$exclude" = "0" -a \( "$j" != "$MONGODB_COLLECTION_WIND" -o "$PARAM" = "weekly" \) ]; then
echo " Backing up collection $j in MongoDB $i running on port $MONGO_PORT"
echo "$MONGOEXPORT_CMD --port $MONGO_PORT -d $i -c $j > $DB_DIR/$j.json"
mkdir -p $DB_DIR
@@ -17,7 +17,7 @@
<title>Dashboard</title>
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript"
src="com.sap.sailing.dashboards.gwt.RibDashboard/com.sap.sailing.dashboards.gwt.RibDashboard.nocache.js"></script>
@@ -1 +0,0 @@
(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level}Line truncated
@@ -1 +0,0 @@
(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.leveLine truncated
@@ -1,2 +0,0 @@
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;iLine truncated
{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof(r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacityLine truncated
@@ -0,0 +1,2 @@
/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)Line truncated
@@ -16,7 +16,7 @@ public class DashboardManifestLinker extends ManifestLinker {
return new String[] { "/dashboards/RibDashboard.html",
"/dashboards/RibDashboard.css",
"/dashboards/images/dashboardicon.png",
"/dashboards/js/jquery-1.5.2.min.js",
"/dashboards/js/jquery-3.3.1.min.js",
"/sailing-fontface-1.0.cache.css"};
}
}
@@ -46,7 +46,7 @@ public class TestLeaderboardGroupRetrievalProcessor {
Collection<Processor<HasLeaderboardGroupContext, ?>> resultReceivers = new ArrayList<>();
resultReceivers.add(receiver);
retriever = new LeaderboardGroupRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), resultReceivers, 0);
retriever = new LeaderboardGroupRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), resultReceivers, 0, "");
}
private Map<String, LeaderboardGroup> getGroupsInService() {
@@ -6,6 +6,7 @@ import java.util.Map;
import com.sap.sailing.datamining.data.HasGPSFixContext;
import com.sap.sailing.datamining.data.HasLeaderboardContext;
import com.sap.sailing.datamining.data.HasLeaderboardGroupContext;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedLegContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
@@ -17,10 +18,10 @@ import com.sap.sailing.datamining.impl.components.RaceOfCompetitorRetrievalProce
import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorRetrievalProcessor;
import com.sap.sailing.datamining.impl.components.TrackedLegRetrievalProcessor;
import com.sap.sailing.datamining.impl.components.TrackedRaceRetrievalProcessor;
import com.sap.sailing.datamining.impl.data.LeaderboardGroupWithContext;
import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.server.RacingEventService;
import com.sap.sse.common.Distance;
import com.sap.sse.datamining.shared.data.AverageWithStats;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier;
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
@@ -50,7 +51,7 @@ public class SailingPredefinedQueries {
create_AvgSpeed_Per_Competitor());
predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE, "Distance traveled grouped by competitor/team name and leg type"),
create_SumTraveledDistance_Per_Competitor_LegType());
predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_DISTANCE_TRAVELED_PER_COMPETITOR, "Distance traveled grouped by competitor/team name and leg type"),
predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_DISTANCE_TRAVELED_PER_COMPETITOR, "Distance traveled grouped by competitor/team name"),
create_SumTraveledDistance_Per_Competitor());
predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_MANEUVERS_PER_COMPETITOR, "Maneuvers grouped by competitor/team name"),
create_SumManeuvers_Per_Competitor());
@@ -58,15 +59,15 @@ public class SailingPredefinedQueries {
private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Regatta_Race() {
FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList<String>(), "", 0);
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), "");
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), AverageWithStats.class.getName(), "");
ArrayList<DataRetrieverLevelDTO> retrieverLevels = new ArrayList<>();
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardGroupContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), ""), null));
DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels);
ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain);
@@ -82,15 +83,15 @@ public class SailingPredefinedQueries {
private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Competitor_LegType() {
FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList<String>(), "", 0);
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), "");
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), AverageWithStats.class.getName(), "");
ArrayList<DataRetrieverLevelDTO> retrieverLevels = new ArrayList<>();
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardGroupContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), ""), null));
DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels);
ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain);
@@ -109,11 +110,11 @@ public class SailingPredefinedQueries {
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Distance.class.getName(), Distance.class.getName(), "");
ArrayList<DataRetrieverLevelDTO> retrieverLevels = new ArrayList<>();
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardGroupContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), ""), null));
DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels);
ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain);
@@ -129,15 +130,15 @@ public class SailingPredefinedQueries {
private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Competitor() {
FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList<String>(), "", 0);
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), "");
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), AverageWithStats.class.getName(), "");
ArrayList<DataRetrieverLevelDTO> retrieverLevels = new ArrayList<>();
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardGroupContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), ""), null));
DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels);
ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain);
@@ -153,11 +154,11 @@ public class SailingPredefinedQueries {
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Distance.class.getName(), Distance.class.getName(), "");
ArrayList<DataRetrieverLevelDTO> retrieverLevels = new ArrayList<>();
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardGroupContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), ""), null));
DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels);
ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain);
@@ -173,10 +174,10 @@ public class SailingPredefinedQueries {
AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Number.class.getName(), Number.class.getName(), "");
ArrayList<DataRetrieverLevelDTO> retrieverLevels = new ArrayList<>();
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, RaceOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasRaceOfCompetitorContext.class.getName(), "Competitor"), null));
retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardGroupContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), ""), null));
retrieverLevels.add(new DataRetrieverLevelDTO(3, RaceOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasRaceOfCompetitorContext.class.getName(), ""), null));
DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels);
ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain);
@@ -17,8 +17,11 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class BravoFixRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedLegOfCompetitorContext, HasBravoFixContext> {
public BravoFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasBravoFixContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedLegOfCompetitorContext.class, HasBravoFixContext.class, executor, resultReceivers, retrievalLevel);
public BravoFixRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasBravoFixContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasTrackedLegOfCompetitorContext.class, HasBravoFixContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -22,8 +22,11 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
*/
public class BravoFixTrackRetrievalProcessor extends AbstractRetrievalProcessor<HasRaceOfCompetitorContext, HasBravoFixTrackContext> {
public BravoFixTrackRetrievalProcessor(ExecutorService executor, Collection<Processor<HasBravoFixTrackContext, ?>> resultReceivers, int retrievalLevel) {
super(HasRaceOfCompetitorContext.class, HasBravoFixTrackContext.class, executor, resultReceivers, retrievalLevel);
public BravoFixTrackRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasBravoFixTrackContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasRaceOfCompetitorContext.class, HasBravoFixTrackContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -16,8 +16,10 @@ public class CompetitorOfRaceInLeaderboardRetrievalProcessor extends
AbstractRetrievalProcessor<HasLeaderboardContext, HasRaceResultOfCompetitorContext> {
public CompetitorOfRaceInLeaderboardRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasRaceResultOfCompetitorContext, ?>> resultReceivers, int retrievalLevel) {
super(HasLeaderboardContext.class, HasRaceResultOfCompetitorContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasRaceResultOfCompetitorContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasLeaderboardContext.class, HasRaceResultOfCompetitorContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -34,9 +34,9 @@ public class CompleteManeuverCurveWithEstimationDataRetrievalProcessor extends
public CompleteManeuverCurveWithEstimationDataRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasCompleteManeuverCurveWithEstimationDataContext, ?>> resultReceivers,
ManeuverSettings settings, int retrievalLevel) {
ManeuverSettings settings, int retrievalLevel, String retrievedDataTypeMessageKey) {
super(HasRaceOfCompetitorContext.class, HasCompleteManeuverCurveWithEstimationDataContext.class, executor,
resultReceivers, retrievalLevel);
resultReceivers, retrievalLevel, retrievedDataTypeMessageKey);
this.settings = settings;
}
@@ -22,9 +22,11 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class FoilingSegmentRetrievalProcessor extends AbstractRetrievalProcessor<HasRaceOfCompetitorContext, HasFoilingSegmentContext> {
private final FoilingSegmentsDataMiningSettings settings;
public FoilingSegmentRetrievalProcessor(ExecutorService executor, Collection<Processor<HasFoilingSegmentContext, ?>> resultReceivers,
FoilingSegmentsDataMiningSettings settings, int retrievalLevel) {
super(HasRaceOfCompetitorContext.class, HasFoilingSegmentContext.class, executor, resultReceivers, retrievalLevel);
public FoilingSegmentRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasFoilingSegmentContext, ?>> resultReceivers,
FoilingSegmentsDataMiningSettings settings, int retrievalLevel, String retrievedDataTypeMessageKey) {
super(HasRaceOfCompetitorContext.class, HasFoilingSegmentContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
this.settings = settings;
}
@@ -17,8 +17,11 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class GPSFixRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedLegOfCompetitorContext, HasGPSFixContext> {
public GPSFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasGPSFixContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedLegOfCompetitorContext.class, HasGPSFixContext.class, executor, resultReceivers, retrievalLevel);
public GPSFixRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasGPSFixContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasTrackedLegOfCompetitorContext.class, HasGPSFixContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -16,8 +16,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class LeaderboardGroupRetrievalProcessor extends AbstractRetrievalProcessor<RacingEventService, HasLeaderboardGroupContext> {
public LeaderboardGroupRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasLeaderboardGroupContext, ?>> resultReceivers, int retrievalLevel) {
super(RacingEventService.class, HasLeaderboardGroupContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasLeaderboardGroupContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(RacingEventService.class, HasLeaderboardGroupContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -14,8 +14,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class LeaderboardRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardGroupContext, HasLeaderboardContext> {
public LeaderboardRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasLeaderboardContext, ?>> resultReceivers, int retrievalLevel) {
super(HasLeaderboardGroupContext.class, HasLeaderboardContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasLeaderboardContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasLeaderboardGroupContext.class, HasLeaderboardContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -25,9 +25,9 @@ public class ManeuverRetrievalProcessor
public ManeuverRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasManeuverContext, ?>> resultReceivers, ManeuverSettings settings,
int retrievalLevel) {
int retrievalLevel, String retrievedDataTypeMessageKey) {
super(HasTrackedLegOfCompetitorContext.class, HasManeuverContext.class, executor, resultReceivers,
retrievalLevel);
retrievalLevel, retrievedDataTypeMessageKey);
this.settings = settings;
}
@@ -34,9 +34,9 @@ public class ManeuverSpeedDetailsRetrievalProcessor
public ManeuverSpeedDetailsRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasManeuverSpeedDetailsContext, ?>> resultReceivers,
ManeuverSpeedDetailsSettings settings, int retrievalLevel) {
ManeuverSpeedDetailsSettings settings, int retrievalLevel, String retrievedDataTypeMessageKey) {
super(HasManeuverContext.class, HasManeuverSpeedDetailsContext.class, executor, resultReceivers,
retrievalLevel);
retrievalLevel, retrievedDataTypeMessageKey);
this.settings = settings;
}
@@ -17,8 +17,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class MarkPassingRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedLegOfCompetitorContext, HasMarkPassingContext> {
public MarkPassingRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasMarkPassingContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedLegOfCompetitorContext.class, HasMarkPassingContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasMarkPassingContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasTrackedLegOfCompetitorContext.class, HasMarkPassingContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -14,8 +14,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class RaceOfCompetitorRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedRaceContext, HasRaceOfCompetitorContext> {
public RaceOfCompetitorRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasRaceOfCompetitorContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedRaceContext.class, HasRaceOfCompetitorContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasRaceOfCompetitorContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasTrackedRaceContext.class, HasRaceOfCompetitorContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -14,8 +14,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class TrackedLegOfCompetitorRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedLegContext, HasTrackedLegOfCompetitorContext> {
public TrackedLegOfCompetitorRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasTrackedLegOfCompetitorContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedLegContext.class, HasTrackedLegOfCompetitorContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasTrackedLegOfCompetitorContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasTrackedLegContext.class, HasTrackedLegOfCompetitorContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -14,8 +14,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class TrackedLegRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedRaceContext, HasTrackedLegContext> {
public TrackedLegRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasTrackedLegContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedRaceContext.class, HasTrackedLegContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasTrackedLegContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasTrackedRaceContext.class, HasTrackedLegContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -17,8 +17,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class TrackedRaceRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardContext, HasTrackedRaceContext> {
public TrackedRaceRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasTrackedRaceContext, ?>> resultReceivers, int retrievalLevel) {
super(HasLeaderboardContext.class, HasTrackedRaceContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasTrackedRaceContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasLeaderboardContext.class, HasTrackedRaceContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -22,8 +22,11 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
*/
public class WindFixRetrievalProcessor extends AbstractRetrievalProcessor<HasWindTrackContext, HasWindFixContext> {
public WindFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasWindFixContext, ?>> resultReceivers, int retrievalLevel) {
super(HasWindTrackContext.class, HasWindFixContext.class, executor, resultReceivers, retrievalLevel);
public WindFixRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasWindFixContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasWindTrackContext.class, HasWindFixContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -22,8 +22,11 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
*/
public class WindTrackRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedRaceContext, HasWindTrackContext> {
public WindTrackRetrievalProcessor(ExecutorService executor, Collection<Processor<HasWindTrackContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedRaceContext.class, HasWindTrackContext.class, executor, resultReceivers, retrievalLevel);
public WindTrackRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasWindTrackContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasTrackedRaceContext.class, HasWindTrackContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -25,6 +25,10 @@ public class MediaTrack implements Serializable {
private static final long serialVersionUID = 1L;
/**
* Deprecated, as the server only used undefined in all cases. Left in, to not break serialisation/storage
*/
@Deprecated
public enum Status {
UNDEFINED('?'), CANNOT_PLAY('-'), NOT_REACHABLE('#'), REACHABLE('+');
@@ -45,6 +49,7 @@ public class MediaTrack implements Serializable {
public TimePoint startTime;
public Duration duration;
public MimeType mimeType;
@Deprecated
public Status status = Status.UNDEFINED;
public Set<RegattaAndRaceIdentifier> assignedRaces;
@@ -76,7 +81,7 @@ public class MediaTrack implements Serializable {
}
public TimePoint deriveEndTime() {
if (startTime != null) {
if (startTime != null && duration != null) {
return startTime.plus(duration);
} else {
return null;
@@ -153,5 +158,4 @@ public class MediaTrack implements Serializable {
return false;
}
}
}
@@ -14,6 +14,7 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.logging.Logger;
import java.util.regex.Pattern;
@@ -184,7 +185,16 @@ public abstract class OnlineTracTracBasedTest extends AbstractTracTracLiveTest i
getSemaphor().wait();
}
}
logger.info("Stored data has been loaded for " + race.getName());
logger.info("Stored data has been loaded for " + race.getName()+". Waiting for receivers to process it...");
final CountDownLatch latch = new CountDownLatch(receivers.size());
for (Receiver receiver : receivers) {
receiver.callBackWhenLoadingQueueIsDone(r->{
latch.countDown();
logger.info(receiver+" done loading");
});
}
latch.await();
logger.info("Stored data has been processed by receivers");
for (Receiver receiver : receivers) {
logger.info("Stopping receiver "+receiver);
receiver.stopAfterNotReceivingEventsForSomeTime(/* timeoutInMilliseconds */ 5000l);
@@ -27,7 +27,7 @@
<link rel="stylesheet" type="text/css" href="SettingsDialog.css">
<link rel="stylesheet" type="text/css" href="AdminConsole.css">
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<!-- Client-side QR code generation -->
+1 -1
View File
@@ -41,7 +41,7 @@
</script>
<script type="text/javascript" src="com.sap.sailing.gwt.autoplay.AutoPlay/com.sap.sailing.gwt.autoplay.AutoPlay.nocache.js"></script>
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<!-- Client-side QR code generation -->
<script type="text/javascript" src="qrcode/qrcode.min.js"></script>
+111 -18
View File
@@ -160,7 +160,7 @@ input.magnifier {
font-size: 20px;
height: 70px;
margin: 0 auto;
padding: 49px 0 0 80px;
padding: 25px 0 0 80px;
width: 400px;
color: #7c7c7c;
background: url(images/important-message.png) left center no-repeat;
@@ -172,7 +172,7 @@ input.magnifier {
font-size: 20px;
height: 70px;
margin: 0 auto;
padding: 49px 0 0 40px;
padding: 25px 0 0 40px;
width: 400px;
color: #7c7c7c;
background: url(images/busy_indicator_circle.gif) left center no-repeat;
@@ -211,13 +211,23 @@ input.magnifier {
border-bottom: 1px solid rgba(0, 0, 0, 0.25);
}
.definitionProviderControlsElements {
margin: 2px;
}
.settingsAnchor {
position: relative;
top: 9px;
top: 7.5px;
}
.groupingProvider {
padding: 3px 0px;
overflow-y: auto;
}
.groupingProviderLabel{
margin: 2px 2px 2px 0px;
display: inline-block;
}
.groupingProviderElement {
@@ -226,32 +236,82 @@ input.magnifier {
}
.statisticProvider {
padding: 5px 0px 0px 0px;
padding: 5px 0px;
display: table;
}
.statisticProviderLabel {
display: table-cell;
white-space: nowrap;
padding: 0px 3px;
}
.statisticProviderElement {
margin: 2px;
display: inline-block;
display: table-cell;
width: auto;
}
.unsupportedAggregatorListItem {
color: gray;
}
.statisticSuggestBoxContainer {
width: 100%;
min-width: 300px;
}
.statisticSuggestBoxPopup {
z-index: 2;
}
.statisticSuggestBoxPopup .suggestPopupContent {
.statisticSuggestBoxPopupContent {
max-height: 700px;
overflow-y: scroll;
overflow-y: auto;
background: white;
}
.statisticSuggestBoxPopupContent table {
border-spacing: 0px;
}
.definitionProviderControls {
margin: 2px;
.statisticSuggestBoxPopupContent .item {
padding: 2px 5px;
color: #000;
cursor: default;
white-space: nowrap;
font-size: 15px;
}
.statisticSuggestBoxPopupContent .item-even {
background: #fff;
}
.statisticSuggestBoxPopupContent .item-odd {
background: #f3f7fb;
}
.statisticSuggestBoxPopupContent .item-selected {
background: #d5e2ff;
}
.statisticSuggestBoxPopupContent .item-unsupported {
color: gray;
}
.definitionProviderControlsElements {
margin: 2px;
.statisticSuggestBoxPopupContent .separator {
padding: 8px 5px 0px 5px;
border-bottom: 2px solid #6f7277;
font-weight: 600;
font-size: 15px;
}
.statisticSuggestBoxPopupContent .separator-message {
padding: 8px 5px 0px 5px;
font-weight: bold;
font-size: 15px;
text-align: center;
white-space: pre-wrap;
}
.statisticSuggestBoxPopupContent .separator-unsupported {
color: gray;
}
.queryProviderElementLabel {
margin-left: 0px;
.dataMiningListBox {
min-width: 120px;
}
.queryDefinitionViewerContent {
@@ -261,6 +321,7 @@ input.magnifier {
.filterDimensionsTitleLabel {
padding-top: 5px;
display: inline-block;
}
.filterFilterDimensionsPanel {
@@ -276,9 +337,12 @@ input.magnifier {
padding-top: 5px;
}
.dimensionFilterSelectionHeader .gwt-Label {
color: #4b4a4a;
text-shadow: #ddf 1px 1px 0;
.filterSelectionPresenter {
margin: 5px;
}
.filterSelectionPresenter .dimensionLabel {
margin-right: 2px;
text-shadow: 0 0 1px #888;
}
.dataMiningBorderTop {
@@ -288,7 +352,7 @@ input.magnifier {
border-left: 2px solid #6f7277;
}
.dataMiningBorderBottom {
border-border: 2px solid #6f7277;
border-bottom: 2px solid #6f7277;
}
.dataMiningBorderRight {
border-right: 2px solid #6f7277;
@@ -323,9 +387,15 @@ input.magnifier {
.dataMiningMarginLeft {
margin-left: 5px;
}
.dataMiningMarginTop {
margin-top: 5px;
}
.dataMiningMarginRight {
margin-right: 5px;
}
.dataMiningMarginBottom {
margin-bottom: 5px;
}
.resultsPresenterTabHeader * {
display: inline-block;
@@ -335,4 +405,27 @@ input.magnifier {
.emphasizedLabel {
font-weight: 600;
}
.floatRight {
float: right;
}
.whiteGlass {
background-color: #fff;
opacity: 0.6;
z-index: 19;
}
.applyQueryBusyMessage {
font-family: 'Open Sans',Arial,Verdana,sans-serif;
font-weight: 600;
font-size: 20px;
height: 70px;
margin: auto auto;
padding: 25px 0 0 40px;
width: 200px;
color: #7c7c7c;
background: url(images/busy_indicator_circle.gif) left center no-repeat;
z-index: 20;
}
+1 -1
View File
@@ -17,7 +17,7 @@
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
<link rel="stylesheet" type="text/css" href="DataMining.css">
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" language="javascript" src="com.sap.sailing.gwt.ui.DataMining/com.sap.sailing.gwt.ui.DataMining.nocache.js"></script>
@@ -20,7 +20,7 @@
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
<link rel="stylesheet" type="text/css" href="EmbeddedMapAndWindChart.css">
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js></script>
<script type="text/javascript" language="javascript" src="com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart/com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart.nocache.js"></script>
+1 -1
View File
@@ -12,7 +12,7 @@
href="/sailing-normalize-3.0.2.cache.css">
<link rel="stylesheet" type="text/css"
href="/sailing-fontface-1.0.cache.css">
<script src="js/jquery-1.11.1.min.js"></script>
<script src="js/jquery-3.3.1.min.js"></script>
<link rel="stylesheet" type="text/css" href="js/jquery.slick/slick-1.5.8.css"/>
<script type="text/javascript" src="js/jquery.slick/slick-1.5.8.min.js"></script>
+1 -1
View File
@@ -18,7 +18,7 @@
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
<link rel="stylesheet" type="text/css" href="Leaderboard.css">
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="com.sap.sailing.gwt.ui.Leaderboard/com.sap.sailing.gwt.ui.Leaderboard.nocache.js"></script>
+1 -1
View File
@@ -18,7 +18,7 @@
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
<link rel="stylesheet" type="text/css" href="PairingList.css">
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js></script>
<script type="text/javascript" src="com.sap.sailing.gwt.ui.PairingList/com.sap.sailing.gwt.ui.PairingList.nocache.js"></script>
+1 -1
View File
@@ -20,7 +20,7 @@
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
<link rel="stylesheet" type="text/css" href="RaceBoard.css">
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<link href="js/video-js/video-js.min.css" rel="stylesheet">
<link href="js/video-js/video-js-sapsailing.css" rel="stylesheet">
+1 -1
View File
@@ -18,7 +18,7 @@
<link rel="stylesheet" type="text/css" href="Simulator.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="com.sap.sailing.gwt.ui.Simulator/com.sap.sailing.gwt.ui.Simulator.nocache.js"></script>
+11 -1
View File
@@ -563,6 +563,16 @@
"Copyright 2011, John Resig"
],
"key": "MITL"
},
{
"name": "JQuery",
"version": "3.3.1",
"owner": "jQuery Foundation and other contributors",
"homepage": "http://jquery.com/",
"acknowledgements": [
"Copyright 2018 jQuery Foundation and other contributors"
],
"key": "MITL"
},
{
"name": "json-simple",
@@ -731,7 +741,7 @@
"owner": "\"Mr.doob\"",
"homepage": "https://threejs.org/",
"acknowledgements": [
"Copyright © 2010-2017 three.js authors"
"Copyright (c) 2010-2017 three.js authors"
],
"key": "MIT"
},
-4
View File
@@ -1,4 +0,0 @@
/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"Line truncated
if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=rLine truncated
},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fLine truncated
@@ -1 +0,0 @@
{"version":3,"file":"jquery-1.11.1.min.js","sources":["jquery-1.11.1.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","deletedIds","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","isEmptyObject","key","nodeType","e","ownLast","globalEval","data","trim","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","makeArray","arr","results","Object","inArray","max","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","strundefined","MAX_NEGATIVE","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","childNodes","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","parentNode","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","keys","cache","cacheLength","shift","markFunction","assert","div","createElement","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","doc","parent","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","charAt","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","sibling","n","r","targets","closest","l","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","oLine truncated
-1
View File
@@ -1 +0,0 @@
(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level}Line truncated
-1
View File
@@ -1 +0,0 @@
(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.leveLine truncated
-2
View File
@@ -1,2 +0,0 @@
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;iLine truncated
{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof(r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacityLine truncated
+2
View File
@@ -0,0 +1,2 @@
/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)Line truncated
@@ -1,6 +1,6 @@
package com.sap.sailing.gwt.home.shared.partials.videoplayer;
import com.google.gwt.dom.client.VideoElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Composite;
@@ -73,7 +73,7 @@ public class VideoPlayer extends Composite {
videoJSPlayer.setVideo(video.getMimeType(), video.getSourceRef());
}
public VideoElement getVideoElement() {
public Element getVideoElement() {
return videoJSPlayer.getVideoElement();
}
public boolean isFullscreen() {
@@ -2093,6 +2093,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String manage2SailEventIdBoxTooltip();
String manage2SailPort();
String windFinderSpotCollectionsList();
String audioFiles();
String selectMedia();
String swissTimingUpdateURL();
String swissTimingUpdateUsername();
String swissTimingUpdatePassword();
@@ -1198,13 +1198,13 @@ raceIsInLiveTimePanelMode=Race is Live
backToLiveTimePanelMode=Back to Live
windChart=Wind Chart
windChartLoading=Loading wind data...
mediaNoVideosCaption=No Videos
mediaShowVideoCaption=Show Video
mediaShowVideoTooltip=Click to show video: {0}
mediaHideVideoCaption=Hide Video
mediaHideVideoTooltip=Click to hide video
mediaSelectVideoCaption={0} Videos
mediaSelectVideoTooltip=Click to select video
mediaNoVideosCaption=No media tracks
mediaShowVideoCaption=Show media track
mediaShowVideoTooltip=Click to show media track: {0}
mediaHideVideoCaption=Hide media track
mediaHideVideoTooltip=Click to hide media track
mediaSelectVideoCaption={0} Media tracks
mediaSelectVideoTooltip=Click to select media track
mediaManageMediaCaption=Manage Media
mediaManageMediaTooltip=Configure audio and video clips, synchronize times
showAll=Show all
@@ -2088,6 +2088,8 @@ manage2SailEventIdBox=Manage2Sail Event ID
manage2SailEventURLBox=Manage2Sail EventURL (json)
manage2SailEventIdBoxTooltip=Event ID or a URL that contains the event ID from Manage2Sail
manage2SailPort=Port
audioFiles=Audio tracks
selectMedia=Select Media
swissTimingUpdateURL=Update URL (e.g., for start time and course change feedback)
swissTimingUpdateUsername=Username for sending updates
swissTimingUpdatePassword=Password for sending updates
@@ -2133,4 +2135,4 @@ tagCreateFilterHint=Create a filter set to filter the list of tags.
tagButtonNotSavable=Could not save tag-button on the server!
confirm=Confirm
cancel=Cancel
close=Close
close=Close
@@ -1186,13 +1186,13 @@ raceIsInLiveTimePanelMode=Rennen ist live
backToLiveTimePanelMode=Zurück zu live
windChart=Winddiagramm
windChartLoading=Winddaten werden geladen...
mediaNoVideosCaption=Keine Videos
mediaShowVideoCaption=Video ein
mediaShowVideoTooltip=Video abspielen: {0}
mediaHideVideoCaption=Video aus
mediaHideVideoTooltip=Video ausblenden
mediaSelectVideoCaption={0} Videos
mediaSelectVideoTooltip=Video auswählen
mediaNoVideosCaption=Keine Medienspuren
mediaShowVideoCaption=Medienspur an
mediaShowVideoTooltip=Medienspur abspielen: {0}
mediaHideVideoCaption=Medienspur stop
mediaHideVideoTooltip=Medienspur ausblenden
mediaSelectVideoCaption={0} Medien Dateien
mediaSelectVideoTooltip=Medienspur auswählen
mediaManageMediaCaption=Medien verwalten
mediaManageMediaTooltip=Audio- und Video-Clips verwalten, Zeiten synchronisieren
showAll=Alle zeigen
@@ -2083,6 +2083,8 @@ manage2SailEventId=Manage2Sail Event ID
manage2SailEventURL=Manage2Sail Event URL (json)
manage2SailEventIdBoxTooltip=Event ID von Manage 2 Sail oder URL die die Event ID beinhaltet
manage2SailPort=Port
audioFiles=Tonspuren
selectMedia=Medium auswählen
swissTimingUpdateURL=Update URL (z.B. für Startzeit-Übertragung)
swissTimingUpdateUsername=Benutzername zum Versenden der Updates
swissTimingUpdatePassword=Passwort zum Versenden der Updates
@@ -1194,14 +1194,6 @@ raceIsInLiveTimePanelMode=La carrera es en directo
backToLiveTimePanelMode=Volver a directo
windChart=Gráfico de vientos
windChartLoading=Cargando datos de vientos...
mediaNoVideosCaption=No hay vídeos
mediaShowVideoCaption=Mostrar vídeo
mediaShowVideoTooltip=Haga clic para mostrar vídeo: {0}
mediaHideVideoCaption=Ocultar vídeo
mediaHideVideoTooltip=Haga clic para ocultar vídeo
mediaSelectVideoCaption={0} Vídeos
mediaSelectVideoTooltip=Haga clic para seleccionar vídeo
mediaManageMediaCaption=Gestionar medios
mediaManageMediaTooltip=Configurar clips de audio y vídeo, sincronizar tiempos
showAll=Mostrar todo
raceVisibilityColumn=Visibilidad
@@ -1194,14 +1194,6 @@ raceIsInLiveTimePanelMode=La course est en direct.
backToLiveTimePanelMode=Retour au direct
windChart=Graphique du vent
windChartLoading=Chargement des données de vent...
mediaNoVideosCaption=Aucune vidéo
mediaShowVideoCaption=Afficher vidéo
mediaShowVideoTooltip=Cliquer pour afficher la vidéo : {0}
mediaHideVideoCaption=Masquer vidéo
mediaHideVideoTooltip=Cliquer pour masquer la vidéo
mediaSelectVideoCaption={0} vidéos
mediaSelectVideoTooltip=Cliquer pour sélectionner la vidéo
mediaManageMediaCaption=Gestion des médias
mediaManageMediaTooltip=Configurer des clips audio et vidéo, synchroniser durées
showAll=Afficher tout
raceVisibilityColumn=Visibilité
@@ -1194,14 +1194,6 @@ raceIsInLiveTimePanelMode=レースがライブ中
backToLiveTimePanelMode=ライブに戻る
windChart=風チャート
windChartLoading=風データをロード中...
mediaNoVideosCaption=動画なし
mediaShowVideoCaption=動画表示
mediaShowVideoTooltip=クリックして動画を表示: {0}
mediaHideVideoCaption=動画非表示
mediaHideVideoTooltip=クリックして動画を非表示
mediaSelectVideoCaption={0} 動画
mediaSelectVideoTooltip=クリックして動画を選択
mediaManageMediaCaption=メディア管理
mediaManageMediaTooltip=音声および動画クリックを設定して、時間を同期
showAll=全表示
raceVisibilityColumn=可視性
@@ -1194,14 +1194,6 @@ raceIsInLiveTimePanelMode=Corrida ao vivo
backToLiveTimePanelMode=Voltar ao tempo real
windChart=Carta de ventos
windChartLoading=Carregando dados do vento...
mediaNoVideosCaption=Nenhum vídeo
mediaShowVideoCaption=Visualizar vídeo
mediaShowVideoTooltip=Clicar para visualizar vídeo: {0}
mediaHideVideoCaption=Ocultar vídeo
mediaHideVideoTooltip=Clicar para ocultar vídeo
mediaSelectVideoCaption={0} vídeos
mediaSelectVideoTooltip=Clicar para selecionar vídeo
mediaManageMediaCaption=Administrar mídia
mediaManageMediaTooltip=Configurar clipes de áudio e vídeo, sincronizar horas
showAll=Visualizar tudo
raceVisibilityColumn=Visibilidade
@@ -1194,14 +1194,6 @@ raceIsInLiveTimePanelMode=Гонка активна
backToLiveTimePanelMode=Вернуться в оперативный режим
windChart=Диаграмма ветра
windChartLoading=Загрузка данных о ветре...
mediaNoVideosCaption=Нет видео
mediaShowVideoCaption=Показать видео
mediaShowVideoTooltip=Щелкните, чтобы показать видео: {0}
mediaHideVideoCaption=Скрыть видео
mediaHideVideoTooltip=Щелкните, чтобы скрыть видео
mediaSelectVideoCaption={0} видео
mediaSelectVideoTooltip=Щелкните, чтобы выбрать видео
mediaManageMediaCaption=Управление мультимедиа
mediaManageMediaTooltip=Настройка аудио- и видеоклипов, синхронизация времени
showAll=Показать все
raceVisibilityColumn=Видимость
@@ -1194,14 +1194,6 @@ raceIsInLiveTimePanelMode=正在直播比赛轮次
backToLiveTimePanelMode=返回实况
windChart=风力记录
windChartLoading=正在加载风力数据...
mediaNoVideosCaption=无视频
mediaShowVideoCaption=显示视频
mediaShowVideoTooltip=点击显示视频: {0}
mediaHideVideoCaption=隐藏视频
mediaHideVideoTooltip=点击隐藏视频
mediaSelectVideoCaption={0}个视频
mediaSelectVideoTooltip=点击选择视频
mediaManageMediaCaption=管理媒体
mediaManageMediaTooltip=配置音频和视频短片,同步时间
showAll=显示全部
raceVisibilityColumn=可见性
@@ -2,20 +2,20 @@ package com.sap.sailing.gwt.ui.client.media;
import com.google.gwt.user.client.ui.Panel;
import com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer.PlayerCloseListener;
import com.sap.sailing.gwt.ui.client.media.shared.VideoPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.VideoSynchPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaSynchPlayer;
public abstract class AbstractVideoContainer {
public abstract class AbstractMediaContainer implements MediaPlayerContainer {
protected final PlayerCloseListener popupCloseListener;
protected final PopoutListener popoutListener;
protected final VideoSynchPlayer videoPlayer;
protected final MediaSynchPlayer mediaPlayer;
protected final Panel rootPanel;
public AbstractVideoContainer(Panel rootPanel, VideoSynchPlayer videoPlayer, PopoutListener popoutListener, PlayerCloseListener playerCloseListener) {
public AbstractMediaContainer(Panel rootPanel, MediaSynchPlayer mediaPlayer, PopoutListener popoutListener,
PlayerCloseListener playerCloseListener) {
this.rootPanel = rootPanel;
this.videoPlayer = videoPlayer;
this.mediaPlayer = mediaPlayer;
this.popoutListener = popoutListener;
this.popupCloseListener = playerCloseListener;
}
@@ -24,13 +24,15 @@ public abstract class AbstractVideoContainer {
abstract void show();
@Override
public void shutDown() {
videoPlayer.shutDown();
mediaPlayer.shutDown();
hide();
}
public VideoPlayer getVideoPlayer() {
return videoPlayer;
@Override
public MediaSynchPlayer getMediaPlayer() {
return mediaPlayer;
}
}
@@ -1,6 +1,5 @@
package com.sap.sailing.gwt.ui.client.media;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.StringMessages;
public abstract class AbstractMediaSelectionControl implements MediaPlayerManager.PlayerChangeListener {
@@ -14,11 +13,6 @@ public abstract class AbstractMediaSelectionControl implements MediaPlayerManage
this.stringMessages = stringMessages;
}
protected boolean isPotentiallyPlayable(MediaTrack mediaTrack) {
return MediaTrack.Status.REACHABLE.equals(mediaTrack.status)
|| MediaTrack.Status.UNDEFINED.equals(mediaTrack.status);
}
@Override
public void notifyStateChange() {
updateUi();
@@ -1,19 +0,0 @@
package com.sap.sailing.gwt.ui.client.media;
import com.google.gwt.media.client.Audio;
import com.google.gwt.media.client.MediaBase;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.media.shared.AudioPlayer;
public class AudioHtmlPlayer extends AbstractHtmlMediaPlayer implements AudioPlayer {
public AudioHtmlPlayer(MediaTrack mediaTrack) {
super(mediaTrack);
}
@Override
protected MediaBase createMediaElement() {
return Audio.createIfSupported();
}
}
@@ -18,12 +18,12 @@ import com.google.gwt.user.client.ui.PopupPanel;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.media.MediaSynchControl.EditButtonProxy;
import com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer.PlayerCloseListener;
import com.sap.sailing.gwt.ui.client.media.shared.VideoSynchPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaSynchPlayer;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.dialog.WindowBox;
import com.sap.sse.security.ui.client.UserService;
public class VideoFloatingContainer extends AbstractVideoContainer implements VideoContainer {
public class FloatingMediaPlayerContainer extends AbstractMediaContainer implements MediaPlayerContainer {
VideoContainerRessource res = GWT.create(VideoContainerRessource.class);
private static final int MIN_WIDTH = 420;
@@ -32,15 +32,15 @@ public class VideoFloatingContainer extends AbstractVideoContainer implements Vi
private final PopupPositionProvider popupPositionProvider;
private Anchor edit;
public VideoFloatingContainer(VideoSynchPlayer videoPlayer, PopupPositionProvider popupPositionProvider,
public FloatingMediaPlayerContainer(MediaSynchPlayer mediaPlayer, PopupPositionProvider popupPositionProvider,
UserService userservice, MediaServiceAsync mediaService, ErrorReporter errorReporter,
PlayerCloseListener playerCloseListener, PopoutListener popoutListener) {
super(new FlowPanel(), videoPlayer, popoutListener, playerCloseListener);
super(new FlowPanel(), mediaPlayer, popoutListener, playerCloseListener);
this.popupPositionProvider = popupPositionProvider;
rootPanel.addStyleName("video-root-panel");
rootPanel.add(videoPlayer.getWidget());
rootPanel.add(mediaPlayer.asWidget());
this.edit = new Anchor();
this.edit.getElement().getStyle().setBackgroundImage("url('" + res.editIcon().getSafeUri().asString() + "')");
@@ -66,19 +66,19 @@ public class VideoFloatingContainer extends AbstractVideoContainer implements Vi
edit.getElement().getStyle().setDisplay(b ? Display.BLOCK : Display.NONE);
}
};
mediaSynchControl = new MediaSynchControl(this.videoPlayer, mediaService, errorReporter, proxy, userservice);
mediaSynchControl = new MediaSynchControl(this.mediaPlayer, mediaService, errorReporter, proxy, userservice);
mediaSynchControl.widget().addStyleName("media-synch-control");
rootPanel.add(mediaSynchControl.widget());
videoPlayer.setEditFlag(mediaSynchControl);
mediaPlayer.setEditFlag(mediaSynchControl);
this.dialogBox = new WindowBox(videoPlayer.getMediaTrack().title, videoPlayer.getMediaTrack().toString(),
this.dialogBox = new WindowBox(mediaPlayer.getMediaTrack().title, mediaPlayer.getMediaTrack().toString(),
rootPanel, new WindowBox.PopoutHandler() {
@Override
public void popout() {
VideoFloatingContainer.this.popoutListener
.popoutVideo(VideoFloatingContainer.this.videoPlayer.getMediaTrack());
FloatingMediaPlayerContainer.this.popoutListener
.popoutVideo(FloatingMediaPlayerContainer.this.mediaPlayer.getMediaTrack());
}
});
// values required for js and youtube player to stay useable
@@ -90,8 +90,8 @@ public class VideoFloatingContainer extends AbstractVideoContainer implements Vi
@Override
public void onClose(CloseEvent<PopupPanel> event) {
VideoFloatingContainer.this.videoPlayer.pauseMedia();
VideoFloatingContainer.this.popupCloseListener.playerClosed();
FloatingMediaPlayerContainer.this.mediaPlayer.pauseMedia();
FloatingMediaPlayerContainer.this.popupCloseListener.playerClosed();
}
});
@@ -140,7 +140,7 @@ public class VideoFloatingContainer extends AbstractVideoContainer implements Vi
int absoluteTop = popupPositionProvider.getYPositionUiObject().getAbsoluteTop();
int posY = absoluteTop - dialogBox.getOffsetHeight() - 40;
dialogBox.setPopupPosition(5, posY);
dialogBox.setPixelSize(videoPlayer.getDefaultWidth(), videoPlayer.getDefaultHeight());
dialogBox.setPixelSize(mediaPlayer.getDefaultWidth(), mediaPlayer.getDefaultHeight());
dialogBox.setVisible(true);
}
});
@@ -16,7 +16,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
@@ -29,7 +28,6 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.useragent.UserAgentDetails.AgentTypes;
public class MediaManagementControl extends AbstractMediaSelectionControl implements CloseHandler<PopupPanel> {
@@ -46,13 +44,13 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
}
public void show() {
Collection<MediaTrack> reachableVideoTracks = new ArrayList<>();
Collection<MediaTrack> reachableAudioTracks = new ArrayList<>();
addAssignedMediaTracksTo(reachableVideoTracks, reachableAudioTracks);
addOverlappingMediaTracksTo(reachableVideoTracks, reachableAudioTracks);
Collection<MediaTrack> videoTracks = new ArrayList<>();
Collection<MediaTrack> audioTracks = new ArrayList<>();
filterGivenMediaTracksTo(videoTracks, audioTracks, mediaPlayerManager.getAssignedMediaTracks());
filterGivenMediaTracksTo(videoTracks, audioTracks, mediaPlayerManager.getOverlappingMediaTracks());
Panel grid = new VerticalPanel();
addAudioTracksToGridPanel(reachableAudioTracks, grid);
addVideoTracksToGridPanel(reachableVideoTracks, grid);
addAudioTracksToGridPanel(audioTracks, grid);
addVideoTracksToGridPanel(videoTracks, grid);
addNewMediaButtonsTo(grid);
dialogControl.add(grid);
dialogControl.showRelativeTo(popupLocation);
@@ -82,44 +80,37 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
grid.add(controlButtons);
}
private void addVideoTracksToGridPanel(Collection<MediaTrack> reachableVideoTracks, Panel grid) {
if (!reachableVideoTracks.isEmpty()) {
grid.add(createVideoHeader());
for (MediaTrack videoTrack : reachableVideoTracks) {
private void addVideoTracksToGridPanel(Collection<MediaTrack> videoTracks, Panel grid) {
if (!videoTracks.isEmpty()) {
grid.add(new Label(stringMessages.videos()));
for (MediaTrack videoTrack : videoTracks) {
grid.add(createVideoOptions(videoTrack, mediaPlayerManager.getPlayingVideoTracks()));
}
}
}
private void addAudioTracksToGridPanel(Collection<MediaTrack> reachableAudioTracks, Panel grid) {
if (!reachableAudioTracks.isEmpty()) {
grid.add(createAudioHeader());
grid.add((RadioButton) createAudioButton(null, mediaPlayerManager.getPlayingAudioTrack()));
for (MediaTrack audioTrack : reachableAudioTracks) {
grid.add(createAudioButton(audioTrack, mediaPlayerManager.getPlayingAudioTrack()));
private void addAudioTracksToGridPanel(Collection<MediaTrack> audioTracks, Panel grid) {
if (!audioTracks.isEmpty()) {
grid.add(new Label(stringMessages.audioFiles()));
grid.add(createAudioButton(null));
for (MediaTrack audioTrack : audioTracks) {
grid.add(createAudioButton(audioTrack));
}
}
}
private void addOverlappingMediaTracksTo(Collection<MediaTrack> reachableVideoTracks,
Collection<MediaTrack> reachableAudioTracks) {
for (MediaTrack mediaTrack : mediaPlayerManager.getOverlappingMediaTracks()) {
if (isPotentiallyPlayable(mediaTrack) && mediaTrack.mimeType != null) {
private void filterGivenMediaTracksTo(Collection<MediaTrack> videoTracks,
Collection<MediaTrack> audioTracks, Iterable<MediaTrack> source) {
for (MediaTrack mediaTrack : source) {
if (mediaTrack.mimeType == null) {
videoTracks.add(mediaTrack); // allow user to remove this strange artifact
} else {
switch (mediaTrack.mimeType.mediaType) {
case video:
reachableVideoTracks.add(mediaTrack);
case audio: // intentional fall through
if (mediaPlayerManager.getUserAgent().getType().equals(AgentTypes.FIREFOX)) {
if (mediaTrack.isYoutube()) {
// only youtube audio tracks work with firefox
reachableAudioTracks.add(mediaTrack);
}
} else {
reachableAudioTracks.add(mediaTrack);
}
case image: // no image media tracks produced by an image
videoTracks.add(mediaTrack);
break;
case unknown: // we won't overlay an unknown media source
case audio:
audioTracks.add(mediaTrack);
break;
default:
break;
@@ -128,44 +119,27 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
}
}
private void addAssignedMediaTracksTo(Collection<MediaTrack> reachableVideoTracks,
Collection<MediaTrack> reachableAudioTracks) {
for (MediaTrack mediaTrack : mediaPlayerManager.getAssignedMediaTracks()) {
if (isPotentiallyPlayable(mediaTrack)) {
if (mediaTrack.mimeType == null) {
reachableVideoTracks.add(mediaTrack); // allow user to remove this strange artifact
private Widget createVideoOptions(final MediaTrack videoTrack, Set<MediaTrack> selectedVideos) {
CheckBox videoCheckBox = new CheckBox(videoTrack.title);
videoCheckBoxes.put(videoTrack, videoCheckBox);
videoCheckBox.setTitle(videoTrack.toString());
videoCheckBox.setValue(selectedVideos.contains(videoTrack));
videoCheckBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> changeEvent) {
if (changeEvent.getValue()) {
mediaPlayerManager.playFloatingVideo(videoTrack);
} else {
switch (mediaTrack.mimeType.mediaType) {
case video:
reachableVideoTracks.add(mediaTrack);
case audio: // intentional fall through
if (mediaPlayerManager.getUserAgent().getType().equals(AgentTypes.FIREFOX)) {
if (mediaTrack.isYoutube()) {
// only youtube audio tracks work with firefox
reachableAudioTracks.add(mediaTrack);
}
} else {
reachableAudioTracks.add(mediaTrack);
}
case image: // images don't play as video tracks
break;
case unknown: // unknown formats won't be played either
break;
default:
break;
}
mediaPlayerManager.closeFloatingPlayer(videoTrack);
}
}
}
}
private Widget createVideoOptions(final MediaTrack videoTrack, Set<MediaTrack> selectedVideos) {
CheckBox playCheckBox = createPlayCheckBox(videoTrack, selectedVideos);
});
if (mediaPlayerManager.allowsEditing()) {
HorizontalPanel panel = new HorizontalPanel();
panel.setWidth("100%");
panel.add(playCheckBox);
panel.add(videoCheckBox);
Button deleteButton = createDeleteButton(videoTrack);
panel.add(deleteButton);
@@ -174,10 +148,10 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
panel.add(connectButton);
panel.setCellHorizontalAlignment(connectButton, HasHorizontalAlignment.ALIGN_RIGHT);
panel.setCellWidth(connectButton, "13");
setEnableOfVideoTrack(connectButton, connectButton.getValue());
setVideoPlayCheckboxEnabled(videoTrack, connectButton.getValue());
return panel;
} else {
return playCheckBox;
return videoCheckBox;
}
}
@@ -201,16 +175,9 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
return connectButton;
}
private void setEnableOfVideoTrack(ToggleButton connectButton, boolean enable) {
Panel videoTrack = (HorizontalPanel)connectButton.getParent();
for (Widget widget : videoTrack) {
if(widget != connectButton && widget instanceof FocusWidget){
((FocusWidget)widget).setEnabled(enable);
if(widget instanceof CheckBox){
((CheckBox)widget).setValue(false);
}
}
}
private void setVideoPlayCheckboxEnabled(MediaTrack videoTrack, boolean enable) {
CheckBox videoCheckBox = videoCheckBoxes.get(videoTrack);
videoCheckBox.setEnabled(enable);
}
private void disconnectVideoFromRace(final MediaTrack videoTrack, final ToggleButton connectButton) {
@@ -224,8 +191,8 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
@Override
public void onSuccess(Void allMediaTracks) {
setEnableOfVideoTrack(connectButton, false);
mediaPlayerManager.closeFloatingVideo(videoTrack);
setVideoPlayCheckboxEnabled(videoTrack, false);
mediaPlayerManager.closeFloatingPlayer(videoTrack);
}
});
@@ -242,7 +209,7 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
@Override
public void onSuccess(Void allMediaTracks) {
setEnableOfVideoTrack(connectButton, true);
setVideoPlayCheckboxEnabled(videoTrack, true);
}
});
}
@@ -259,65 +226,38 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem
return deleteButton;
}
private CheckBox createPlayCheckBox(final MediaTrack videoTrack, Set<MediaTrack> selectedVideos) {
CheckBox videoCheckBox = new CheckBox(videoTrack.title);
videoCheckBoxes.put(videoTrack, videoCheckBox);
videoCheckBox.setTitle(videoTrack.toString());
videoCheckBox.setValue(selectedVideos.contains(videoTrack));
videoCheckBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> changeEvent) {
if (changeEvent.getValue()) {
mediaPlayerManager.playFloatingVideo(videoTrack);
} else {
mediaPlayerManager.closeFloatingVideo(videoTrack);
}
}
});
return videoCheckBox;
}
public void selectVideo(MediaTrack videoTrack) {
CheckBox videoCheckBox = videoCheckBoxes.get(videoTrack);
if (videoCheckBox != null) {
videoCheckBox.setValue(true);
}
}
public void unselectVideo(MediaTrack videoTrack) {
CheckBox videoCheckBox = videoCheckBoxes.get(videoTrack);
if (videoCheckBox != null) {
videoCheckBox.setValue(false);
}
}
private Widget createVideoHeader() {
Label audioHeader = new Label("Videos");
return audioHeader;
}
private Widget createAudioButton(final MediaTrack audioTrack, MediaTrack selectedAudioTrack) {
private Widget createAudioButton(final MediaTrack audioTrack) {
String label = audioTrack != null ? audioTrack.title : "Sound off";
String title = audioTrack != null ? audioTrack.toString() : "Turn off all sound channels.";
RadioButton audioButton = new RadioButton("group-name", label);
audioButton.setTitle(title);
audioButton.setValue(audioTrack == selectedAudioTrack);
audioButton.setValue(audioTrack == mediaPlayerManager.getPlayingAudioTrack());
audioButton.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> changeEvent) {
if (changeEvent.getValue()) {
mediaPlayerManager.playAudio(audioTrack);
Set<MediaTrack> currentlyPlaying = mediaPlayerManager.getPlayingAudioTrack();
if (audioTrack == null) {
currentlyPlaying.forEach(mediaPlayerManager::closeFloatingPlayer);
} else {
mediaPlayerManager.playAudio(audioTrack);
}
}
}
});
return audioButton;
}
private Widget createAudioHeader() {
Label audioHeader = new Label("Audio Tracks");
return audioHeader;
if (mediaPlayerManager.allowsEditing() && audioTrack != null) {
HorizontalPanel panel = new HorizontalPanel();
panel.setWidth("100%");
panel.add(audioButton);
Button deleteButton = createDeleteButton(audioTrack);
panel.add(deleteButton);
panel.setCellHorizontalAlignment(deleteButton, HasHorizontalAlignment.ALIGN_RIGHT);
return panel;
} else {
return audioButton;
}
}
@Override
@@ -1,19 +1,19 @@
package com.sap.sailing.gwt.ui.client.media;
import com.sap.sailing.gwt.ui.client.media.shared.VideoPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaPlayer;
/**
* Interface to decouple container lifecycle from VideoPlayer functionality.
* @author D047974
*
*/
public interface VideoContainer {
public interface MediaPlayerContainer {
/**
* Terminate all playing, release resources and make the container disappear from the UI.
*/
void shutDown();
VideoPlayer getVideoPlayer();
MediaPlayer getMediaPlayer();
}
@@ -18,6 +18,24 @@ public interface MediaPlayerManager {
}
public enum Status {
UNDEFINED('?'), CANNOT_PLAY('-'), NOT_REACHABLE('#'), REACHABLE('+');
private final char symbol;
private Status(char symbol) {
this.symbol = symbol;
}
public String toString() {
return String.valueOf(this.symbol);
}
public boolean isPotentiallyPlayable() {
return this == UNDEFINED || this == REACHABLE;
}
}
void addPlayerChangeListener(PlayerChangeListener playerChangeListener);
void playAudio(MediaTrack audioTrack);
@@ -26,7 +44,7 @@ public interface MediaPlayerManager {
void playFloatingVideo(MediaTrack videoTrack);
void closeFloatingVideo(MediaTrack videoTrack);
void closeFloatingPlayer(MediaTrack videoTrack);
void playDockedVideo(MediaTrack videoTrack);
@@ -44,7 +62,7 @@ public interface MediaPlayerManager {
Boolean isPlaying();
MediaTrack getPlayingAudioTrack();
Set<MediaTrack> getPlayingAudioTrack();
Set<MediaTrack> getPlayingVideoTracks();
@@ -53,7 +71,7 @@ public interface MediaPlayerManager {
Collection<MediaTrack> getOverlappingMediaTracks();
List<MediaTrack> getAudioTracks();
List<MediaTrack> getVideoTracks();
MediaTrack getDockedVideoTrack();
@@ -66,5 +84,7 @@ public interface MediaPlayerManager {
ErrorReporter getErrorReporter();
Status getMediaTrackStatus(MediaTrack track);
}
@@ -9,12 +9,13 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.google.gwt.dom.client.AudioElement;
import com.google.gwt.dom.client.MediaElement;
import com.google.gwt.dom.client.VideoElement;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.media.client.Audio;
import com.google.gwt.media.client.Video;
import com.google.gwt.safehtml.shared.UriUtils;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ClosingEvent;
@@ -24,7 +25,6 @@ import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.media.MediaTrack.Status;
import com.sap.sailing.domain.common.security.Permission;
import com.sap.sailing.domain.common.security.SailingPermissionsForRoleProvider;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
@@ -35,8 +35,7 @@ import com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer.PlayerCloseL
import com.sap.sailing.gwt.ui.client.media.popup.VideoJSWindowPlayer;
import com.sap.sailing.gwt.ui.client.media.popup.YoutubeWindowPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.VideoPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.VideoSynchPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaSynchPlayer;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
@@ -53,7 +52,6 @@ import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.shared.settings.ComponentContext;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
import com.sap.sse.gwt.client.useragent.UserAgentDetails.AgentTypes;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.shared.UserDTO;
@@ -61,18 +59,18 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
MediaPlayerManager, CloseHandler<Window>, ClosingHandler {
static interface VideoContainerFactory<T> {
T createVideoContainer(VideoSynchPlayer videoPlayer, UserService userService, MediaServiceAsync mediaService,
T createVideoContainer(MediaSynchPlayer videoPlayer, UserService userService, MediaServiceAsync mediaService,
ErrorReporter errorReporter, PlayerCloseListener playerCloseListener, PopoutListener popoutListener);
}
private final SimplePanel rootPanel = new SimplePanel();
private final UserService userService;
private MediaPlayer activeAudioPlayer;
private VideoPlayer dockedVideoPlayer;
private final Map<MediaTrack, VideoContainer> activeVideoContainers = new HashMap<MediaTrack, VideoContainer>();
private MediaPlayer dockedVideoPlayer;
private final Map<MediaTrack, MediaPlayerContainer> activePlayerContainers = new HashMap<MediaTrack, MediaPlayerContainer>();
private Collection<MediaTrack> assignedMediaTracks = new ArrayList<>();
private Collection<MediaTrack> overlappingMediaTracks = new ArrayList<>();
private Map<MediaTrack, Status> mediaTrackStatus = new HashMap<>();
private final RegattaAndRaceIdentifier raceIdentifier;
private final RaceTimesInfoProvider raceTimesInfoProvider;
@@ -116,30 +114,25 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
Window.addWindowClosingHandler(this);
}
private static boolean isPotentiallyPlayable(MediaTrack mediaTrack) {
return MediaTrack.Status.REACHABLE.equals(mediaTrack.status)
|| MediaTrack.Status.UNDEFINED.equals(mediaTrack.status);
private boolean isPotentiallyPlayable(MediaTrack mediaTrack) {
Status status = mediaTrackStatus.get(mediaTrack);
return Status.REACHABLE.equals(status) || Status.UNDEFINED.equals(status);
}
private void setStatus(final MediaTrack mediaTrack) {
if (!mediaTrack.isYoutube()) {
// firefox crashes in the current version when trying to read the metadata from mp4 files
if (!userAgent.getType().equals(AgentTypes.FIREFOX)) {
Audio audio = Audio.createIfSupported();
if (audio != null) {
AudioElement mediaReachableTester = audio.getAudioElement();
addLoadMetadataHandler(mediaReachableTester, mediaTrack);
mediaReachableTester.setPreload(MediaElement.PRELOAD_METADATA);
mediaReachableTester.setSrc(UriUtils.fromString(mediaTrack.url).asString());
mediaReachableTester.load();
} else {
mediaTrack.status = Status.CANNOT_PLAY;
}
} else {
mediaTrack.status = Status.REACHABLE;
}
if (mediaTrack.isYoutube()) {
mediaTrackStatus.put(mediaTrack, Status.REACHABLE);
} else {
mediaTrack.status = Status.REACHABLE;
Video video = Video.createIfSupported();
if (video != null) {
VideoElement mediaReachableTester = video.getVideoElement();
addLoadMetadataHandler(mediaReachableTester, mediaTrack);
mediaReachableTester.setPreload(MediaElement.PRELOAD_METADATA);
mediaReachableTester.setSrc(UriUtils.fromString(mediaTrack.url).asString());
mediaReachableTester.load();
} else {
mediaTrackStatus.put(mediaTrack, Status.CANNOT_PLAY);
}
}
}
@@ -160,41 +153,31 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
}-*/;
public void loadedmetadata(MediaTrack mediaTrack) {
mediaTrack.status = Status.REACHABLE;
mediaTrackStatus.put(mediaTrack, Status.REACHABLE);
}
public void mediaError(MediaTrack mediaTrack) {
mediaTrack.status = Status.NOT_REACHABLE;
mediaTrackStatus.put(mediaTrack, Status.NOT_REACHABLE);
}
@Override
public void playDefault() {
MediaTrack defaultVideo = getDefaultVideo();
final MediaTrack defaultVideo = getDefaultMedia(MediaType.video);
if (defaultVideo != null) {
playFloatingVideo(defaultVideo);
playAudio(defaultVideo);
} else {
MediaTrack defaultAudio = getDefaultAudio();
final MediaTrack defaultAudio = getDefaultMedia(MediaType.audio);
if (defaultAudio != null) {
playAudio(defaultAudio);
}
}
}
private MediaTrack getDefaultAudio() {
private MediaTrack getDefaultMedia(MediaType mediaType) {
// TODO: implement a better heuristic than just taking the first to come
for (MediaTrack mediaTrack : assignedMediaTracks) {
if (mediaTrack.mimeType != null && MediaType.audio.equals(mediaTrack.mimeType.mediaType) && isPotentiallyPlayable(mediaTrack)) {
return mediaTrack;
}
}
return null;
}
private MediaTrack getDefaultVideo() {
for (MediaTrack mediaTrack : assignedMediaTracks) {
if (mediaTrack.mimeType != null && MediaType.video.equals(mediaTrack.mimeType.mediaType)
&& isPotentiallyPlayable(mediaTrack)) {
if (mediaTrack.mimeType != null && mediaType.equals(mediaTrack.mimeType.mediaType)
&& getMediaTrackStatus(mediaTrack).isPotentiallyPlayable()) {
return mediaTrack;
}
}
@@ -226,31 +209,15 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
@Override
public void playSpeedFactorChanged(double newPlaySpeedFactor) {
if (isStandaloneAudio()) {// only if audio player isn't one of the video players anyway
activeAudioPlayer.setPlaybackSpeed(newPlaySpeedFactor);
}
for (VideoContainer videoContainer : activeVideoContainers.values()) {
VideoPlayer videoPlayer = videoContainer.getVideoPlayer();
for (MediaPlayerContainer videoContainer : activePlayerContainers.values()) {
MediaPlayer videoPlayer = videoContainer.getMediaPlayer();
videoPlayer.setPlaybackSpeed(newPlaySpeedFactor);
}
}
/**
* Checks if audio player isn't one of the video players
*
* @return
*/
private boolean isStandaloneAudio() {
return activeAudioPlayer != null && !activeVideoContainers.containsKey(activeAudioPlayer.getMediaTrack());
}
private void pausePlaying() {
if (isStandaloneAudio()) { // only if audio player isn't one of the video players anyway
activeAudioPlayer.pauseMedia();
}
for (VideoContainer videoContainer : activeVideoContainers.values()) {
VideoPlayer videoPlayer = videoContainer.getVideoPlayer();
for (MediaPlayerContainer videoContainer : activePlayerContainers.values()) {
MediaPlayer videoPlayer = videoContainer.getMediaPlayer();
if (!videoPlayer.isMediaPaused()) {
videoPlayer.pauseMedia();
}
@@ -258,11 +225,8 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
}
private void startPlaying() {
if (isStandaloneAudio() && activeAudioPlayer.isCoveringCurrentRaceTime()) {
activeAudioPlayer.playMedia();
}
for (VideoContainer videoContainer : activeVideoContainers.values()) {
VideoPlayer videoPlayer = videoContainer.getVideoPlayer();
for (MediaPlayerContainer videoContainer : activePlayerContainers.values()) {
MediaPlayer videoPlayer = videoContainer.getMediaPlayer();
if (videoPlayer.isMediaPaused() && videoPlayer.isCoveringCurrentRaceTime()) {
videoPlayer.playMedia();
}
@@ -271,12 +235,8 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
@Override
public void timeChanged(Date newRaceTime, Date oldRaceTime) {
if (isStandaloneAudio()) { // only if audio player isn't one of the video players anyway
ensurePlayState(activeAudioPlayer);
activeAudioPlayer.raceTimeChanged(newRaceTime);
}
for (VideoContainer videoContainer : activeVideoContainers.values()) {
VideoPlayer videoPlayer = videoContainer.getVideoPlayer();
for (MediaPlayerContainer videoContainer : activePlayerContainers.values()) {
MediaPlayer videoPlayer = videoContainer.getMediaPlayer();
ensurePlayState(videoPlayer);
videoPlayer.raceTimeChanged(newRaceTime);
}
@@ -343,7 +303,6 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
private void notifyStateChange() {
for(PlayerChangeListener listener:playerChangeListener) {
listener.notifyStateChange();
}
}
@@ -351,11 +310,11 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
public void playDockedVideo(MediaTrack videoTrack) {
if ((dockedVideoPlayer == null) || (dockedVideoPlayer.getMediaTrack() != videoTrack)) {
closeDockedVideo();
closeFloatingVideo(videoTrack);
VideoContainer videoDockedContainer = createAndWrapVideoPlayer(videoTrack,
closeFloatingPlayer(videoTrack);
MediaPlayerContainer videoDockedContainer = createAndWrapVideoPlayer(videoTrack,
new VideoContainerFactory<VideoDockedContainer>() {
@Override
public VideoDockedContainer createVideoContainer(VideoSynchPlayer videoPlayer,
public VideoDockedContainer createVideoContainer(MediaSynchPlayer videoPlayer,
UserService userService, MediaServiceAsync mediaService, ErrorReporter errorReporter,
PlayerCloseListener playerCloseListener, PopoutListener popoutListener) {
VideoDockedContainer videoDockedContainer = new VideoDockedContainer(rootPanel,
@@ -365,8 +324,6 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
});
registerVideoContainer(videoTrack, videoDockedContainer);
notifyStateChange();
} else {
// nothing changed
}
}
@@ -376,48 +333,26 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
dockedVideoPlayer.shutDown();
dockedVideoPlayer = null;
notifyStateChange();
} else {
// nothing changed
}
}
@Override
public void playAudio(MediaTrack audioTrack) {
if ((activeAudioPlayer == null) || (activeAudioPlayer.getMediaTrack() != audioTrack)) {
muteAudio();
if ((audioTrack != null) && audioTrack.isYoutube()) { // --> Youtube videos can't be played for audio-only.
// So add a video player first.
playFloatingVideo(audioTrack);
}
VideoContainer playingVideoContainer = activeVideoContainers.get(audioTrack);
if (playingVideoContainer != null) {
VideoPlayer playingVideoPlayer = playingVideoContainer.getVideoPlayer();
activeAudioPlayer = playingVideoPlayer;
activeAudioPlayer.setMuted(false);
} else {
assignNewAudioPlayer(audioTrack);
}
notifyStateChange();
} else {
// nothing changed
}
muteAudio();
playFloatingVideo(audioTrack);
activePlayerContainers.get(audioTrack).getMediaPlayer().setMuted(false);
}
public List<MediaPlayerContainer> getActiveAudioContainers() {
return activePlayerContainers.entrySet().stream()
.filter(f -> f.getKey().mimeType.mediaType == MediaType.audio).map(f -> f.getValue())
.collect(Collectors.toList());
}
@Override
public void muteAudio() {
if (activeAudioPlayer != null) { // --> then reset active audio player
if (activeVideoContainers.containsKey(activeAudioPlayer.getMediaTrack())) { // pre-change audioPlayer is one
// of the
// videoPlayers
activeAudioPlayer.setMuted(true);
} else { // pre-change audioPlayer is a dedicated audio-only player
activeAudioPlayer.shutDown();
}
activeAudioPlayer = null;
notifyStateChange();
} else {
// nothing changed
for (MediaPlayerContainer player : getActiveAudioContainers()) {
closeFloatingPlayer(player.getMediaPlayer().getMediaTrack());
}
}
@@ -426,15 +361,15 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
if (dockedVideoPlayer != null && dockedVideoPlayer.getMediaTrack() == videoTrack) {
closeDockedVideo();
}
VideoContainer activeVideoContainer = activeVideoContainers.get(videoTrack);
MediaPlayerContainer activeVideoContainer = activePlayerContainers.get(videoTrack);
if (activeVideoContainer == null) {
VideoFloatingContainer videoFloatingContainer = createAndWrapVideoPlayer(videoTrack,
new VideoContainerFactory<VideoFloatingContainer>() {
FloatingMediaPlayerContainer videoFloatingContainer = createAndWrapVideoPlayer(videoTrack,
new VideoContainerFactory<FloatingMediaPlayerContainer>() {
@Override
public VideoFloatingContainer createVideoContainer(VideoSynchPlayer videoPlayer,
public FloatingMediaPlayerContainer createVideoContainer(MediaSynchPlayer videoPlayer,
UserService userservice, MediaServiceAsync mediaService, ErrorReporter errorReporter,
PlayerCloseListener playerCloseListener, PopoutListener popoutListener) {
VideoFloatingContainer videoFloatingContainer = new VideoFloatingContainer(videoPlayer, popupPositionProvider,
FloatingMediaPlayerContainer videoFloatingContainer = new FloatingMediaPlayerContainer(videoPlayer, popupPositionProvider,
userservice, mediaService, errorReporter, playerCloseListener, popoutListener);
return videoFloatingContainer;
}
@@ -442,19 +377,17 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
registerVideoContainer(videoTrack, videoFloatingContainer);
notifyStateChange();
} else {
// nothing changed
}
}
private <T> T createAndWrapVideoPlayer(final MediaTrack videoTrack, VideoContainerFactory<T> videoContainerFactory) {
final PopoutWindowPlayer.PlayerCloseListener playerCloseListener = new PopoutWindowPlayer.PlayerCloseListener() {
private VideoContainer videoContainer;
private MediaPlayerContainer videoContainer;
@Override
public void playerClosed() {
if (videoContainer == null) {
closeFloatingVideo(videoTrack);
closeFloatingPlayer(videoTrack);
} else {
registerVideoContainer(videoTrack, videoContainer);
videoContainer = null;
@@ -462,45 +395,37 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
}
@Override
public void setVideoContainer(VideoContainer videoContainer) {
public void setVideoContainer(MediaPlayerContainer videoContainer) {
this.videoContainer = videoContainer;
}
};
PopoutListener popoutListener = new PopoutListener() {
@Override
public void popoutVideo(MediaTrack videoTrack) {
VideoContainer videoContainer;
MediaPlayerContainer videoContainer;
if (videoTrack.isYoutube()) {
videoContainer = new YoutubeWindowPlayer(videoTrack, playerCloseListener);
} else {
videoContainer = new VideoJSWindowPlayer(videoTrack, playerCloseListener);
}
playerCloseListener.setVideoContainer(videoContainer);
closeFloatingVideo(videoTrack);
closeFloatingPlayer(videoTrack);
}
};
final VideoSynchPlayer videoPlayer;
final MediaSynchPlayer videoPlayer;
if (videoTrack.isYoutube()) {
videoPlayer = new VideoYoutubePlayer(videoTrack, getRaceStartTime(), raceTimer);
} else {
videoPlayer = new VideoJSSyncPlayer(videoTrack, getRaceStartTime(), raceTimer);
}
return videoContainerFactory.createVideoContainer(videoPlayer, userService, getMediaService(), errorReporter,
playerCloseListener, popoutListener);
}
private void registerVideoContainer(final MediaTrack videoTrack, final VideoContainer videoContainer) {
VideoPlayer videoPlayer = videoContainer.getVideoPlayer();
activeVideoContainers.put(videoTrack, videoContainer);
if ((activeAudioPlayer != null) && (activeAudioPlayer.getMediaTrack() == videoTrack)) { // selected video track
// has been playing as
// audio-only
activeAudioPlayer.pauseMedia();
activeAudioPlayer = videoContainer.getVideoPlayer();
videoPlayer.setMuted(false);
} else {
videoPlayer.setMuted(true);
}
private void registerVideoContainer(final MediaTrack videoTrack, final MediaPlayerContainer videoContainer) {
MediaPlayer videoPlayer = videoContainer.getMediaPlayer();
activePlayerContainers.put(videoTrack, videoContainer);
synchPlayState(videoPlayer);
notifyStateChange();
}
@@ -524,27 +449,12 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
}
@Override
public void closeFloatingVideo(MediaTrack videoTrack) {
VideoContainer removedVideoContainer = activeVideoContainers.remove(videoTrack);
public void closeFloatingPlayer(MediaTrack videoTrack) {
MediaPlayerContainer removedVideoContainer = activePlayerContainers.remove(videoTrack);
if (removedVideoContainer != null) {
removedVideoContainer.shutDown();
if (activeAudioPlayer != null && activeAudioPlayer.getMediaTrack() == videoTrack) {
assignNewAudioPlayer(null);
}
notifyStateChange();
} else {
// nothing changed
}
}
private void assignNewAudioPlayer(MediaTrack audioTrack) {
if (audioTrack != null) {
activeAudioPlayer = new AudioHtmlPlayer(audioTrack);
synchPlayState(activeAudioPlayer);
} else {
activeAudioPlayer = null;
}
notifyStateChange();
}
private boolean isLive() {
@@ -585,18 +495,11 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
@Override
public void stopAll() {
if (activeAudioPlayer != null) {
if (!activeVideoContainers.containsKey(activeAudioPlayer.getMediaTrack())) { // only if audio player isn't
// one of the video players
// anyway.
activeAudioPlayer.shutDown();
}
activeAudioPlayer = null;
for (MediaPlayerContainer mediaContainer : new ArrayList<>(activePlayerContainers.values())) {
// using a copy to prevent a ConcurrentModificationException
mediaContainer.shutDown();
}
for (VideoContainer videoContainer : new ArrayList<VideoContainer>(activeVideoContainers.values())) { //using a copy to prevent a ConcurrentModificationException
videoContainer.shutDown();
}
activeVideoContainers.clear();
activePlayerContainers.clear();
notifyStateChange();
}
@@ -651,9 +554,8 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
@Override
public void onSuccess(Void _void) {
MediaPlayerManagerComponent.this.closeFloatingVideo(mediaTrack);
assignedMediaTracks.remove(mediaTrack);
notifyStateChange();
MediaPlayerManagerComponent.this.closeFloatingPlayer(mediaTrack);
}
});
return true;
@@ -672,7 +574,7 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
@Override
public Boolean isPlaying() {
return (activeAudioPlayer != null) || (!activeVideoContainers.isEmpty());
return !activePlayerContainers.isEmpty();
}
@Override
@@ -681,11 +583,6 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
}
@Override
public MediaTrack getPlayingAudioTrack() {
return activeAudioPlayer != null ? activeAudioPlayer.getMediaTrack() : null;
}
@Override
public MediaTrack getDockedVideoTrack() {
return dockedVideoPlayer != null ? dockedVideoPlayer.getMediaTrack() : null;
@@ -693,7 +590,7 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
@Override
public Set<MediaTrack> getPlayingVideoTracks() {
return activeVideoContainers.keySet();
return activePlayerContainers.keySet();
}
@Override
@@ -718,13 +615,18 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
@Override
public List<MediaTrack> getVideoTracks() {
List<MediaTrack> result = new ArrayList<MediaTrack>();
for (MediaTrack mediaTrack : assignedMediaTracks) {
if (mediaTrack.mimeType != null && mediaTrack.mimeType.mediaType == MediaType.video) {
result.add(mediaTrack);
}
}
return result;
return getMediaTracks(MediaType.video);
}
@Override
public List<MediaTrack> getAudioTracks() {
return getMediaTracks(MediaType.audio);
}
private List<MediaTrack> getMediaTracks(MediaType mediaType) {
return assignedMediaTracks.stream()
.filter(mediaTrack -> mediaTrack.mimeType != null && mediaType == mediaTrack.mimeType.mediaType)
.collect(Collectors.toList());
}
@Override
@@ -772,17 +674,6 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
return "media";
}
@Override
public List<MediaTrack> getAudioTracks() {
List<MediaTrack> result = new ArrayList<MediaTrack>();
for (MediaTrack mediaTrack : assignedMediaTracks) {
if (mediaTrack.mimeType != null && mediaTrack.mimeType.mediaType == MediaType.audio) {
result.add(mediaTrack);
}
}
return result;
}
@Override
public UserAgentDetails getUserAgent() {
return userAgent;
@@ -807,4 +698,15 @@ public class MediaPlayerManagerComponent extends AbstractComponent<MediaPlayerSe
public String getId() {
return mediaPlayerLifecycle.getComponentId();
}
@Override
public Set<MediaTrack> getPlayingAudioTrack() {
return getActiveAudioContainers().stream().map(f -> f.getMediaPlayer().getMediaTrack())
.collect(Collectors.toSet());
}
@Override
public Status getMediaTrackStatus(MediaTrack track) {
return mediaTrackStatus.getOrDefault(track, Status.UNDEFINED);
}
}
@@ -28,38 +28,25 @@ public class MediaSingleSelectionControl extends AbstractMediaSelectionControl i
this.dialogControl = new DialogBox(true, false);
this.dialogControl.addStyleName("Media-Select-Popup");
this.dialogControl.setText("Select Video");
this.dialogControl.setText(stringMessages.selectMedia());
this.dialogControl.addCloseHandler(this);
}
public void show() {
Collection<MediaTrack> mediaTracks = new ArrayList<MediaTrack>();
addPotentiallyPlayableMediaTracksTo(mediaTracks);
final Collection<MediaTrack> mediaTracks = new ArrayList<>(mediaPlayerManager.getAssignedMediaTracks());
Panel mediaPanel = new VerticalPanel();
addMediaEntriesToGridPanel(mediaTracks, mediaPanel);
mediaTracks.forEach(track -> mediaPanel.add(createMediaEntry(track)));
dialogControl.add(mediaPanel);
dialogControl.showRelativeTo(popupLocation);
}
private void addMediaEntriesToGridPanel(Collection<MediaTrack> mediaTracks, Panel mediaPanel) {
for (MediaTrack videoTrack : mediaTracks) {
mediaPanel.add(createMediaEntry(videoTrack));
}
}
private void addPotentiallyPlayableMediaTracksTo(Collection<MediaTrack> mediaTracks) {
for (MediaTrack mediaTrack : mediaPlayerManager.getAssignedMediaTracks()) {
if (isPotentiallyPlayable(mediaTrack)) {
mediaTracks.add(mediaTrack);
}
}
}
private Button createMediaEntry(final MediaTrack mediaTrack) {
Button mediaSelectButton = new Button(mediaTrack.title);
Button mediaSelectButton = new Button(
mediaPlayerManager.getMediaTrackStatus(mediaTrack).toString() + " " + mediaTrack.title);
mediaSelectButton.setStyleName("Media-Select-Button");
if (mediaTrack.equals(mediaPlayerManager.getPlayingAudioTrack()) || mediaPlayerManager.getPlayingVideoTracks().contains(mediaTrack)) {
if (mediaPlayerManager.getPlayingAudioTrack().contains(mediaTrack)
|| mediaPlayerManager.getPlayingVideoTracks().contains(mediaTrack)) {
mediaSelectButton.setTitle(stringMessages.mediaHideVideoTooltip());
mediaSelectButton.addStyleName("Media-Select-Button-playing");
mediaSelectButton.addClickHandler(new ClickHandler() {
@@ -69,7 +56,7 @@ public class MediaSingleSelectionControl extends AbstractMediaSelectionControl i
if (mediaPlayerManager.getPlayingAudioTrack() == mediaTrack) {
mediaPlayerManager.muteAudio();
}
mediaPlayerManager.closeFloatingVideo(mediaTrack);
mediaPlayerManager.closeFloatingPlayer(mediaTrack);
hide();
};
});
@@ -2,11 +2,11 @@ package com.sap.sailing.gwt.ui.client.media;
import com.google.gwt.user.client.ui.Panel;
import com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer.PlayerCloseListener;
import com.sap.sailing.gwt.ui.client.media.shared.VideoSynchPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaSynchPlayer;
public class VideoDockedContainer extends AbstractVideoContainer implements VideoContainer {
public class VideoDockedContainer extends AbstractMediaContainer implements MediaPlayerContainer {
public VideoDockedContainer(Panel rootPanel, VideoSynchPlayer videoPlayer, PlayerCloseListener playerCloseListener, PopoutListener popoutListener) {
public VideoDockedContainer(Panel rootPanel, MediaSynchPlayer videoPlayer, PlayerCloseListener playerCloseListener, PopoutListener popoutListener) {
super(rootPanel, videoPlayer, popoutListener, playerCloseListener);
}
@@ -2,10 +2,10 @@ package com.sap.sailing.gwt.ui.client.media;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.SourceElement;
import com.google.gwt.dom.client.VideoElement;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
@@ -30,20 +30,25 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
interface VideoJSStyle extends CssResource {
String invertedVideoPlayer();
String player();
}
@UiField
VideoJSStyle style;
@UiField
VideoElement videoElement;
DivElement playerHolder;
private Element videoElement;
private final String elementId;
private String elementId;
private JavaScriptObject player;
private boolean autoplay;
private Boolean panorama;
private Timer resizeChecker;
private boolean fullHeightWidth;
public HandlerRegistration addPlayHandler(PlayEvent.Handler handler) {
return addHandler(handler, PlayEvent.getType());
@@ -55,7 +60,23 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
public VideoJSPlayer(boolean fullHeightWidth, boolean autoplay) {
this.autoplay = autoplay;
this.fullHeightWidth = fullHeightWidth;
setElement(uiBinder.createAndBindUi(this));
}
public void setVideo(MimeType mimeType, String source) {
if (mimeType.mediaType == MediaType.audio) {
videoElement = Document.get().createAudioElement();
} else {
videoElement = Document.get().createVideoElement();
}
playerHolder.appendChild(videoElement);
videoElement.addClassName(style.player());
videoElement.addClassName("video-js");
videoElement.addClassName("vjs-default-skin");
videoElement.addClassName("vjs-big-play-centered");
videoElement.setAttribute("preload", "auto");
videoElement.setId(elementId = "videojs_" + Document.get().createUniqueId());
if (fullHeightWidth) {
videoElement.addClassName("video-js-fullscreen");
@@ -69,12 +90,7 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
onResize();
}
};
}
public void setVideo(MimeType mimeType, String source) {
if (mimeType == null || mimeType.mediaType != MediaType.video) {
return;
}
this.panorama = mimeType.isPanorama();
if (this.panorama) {
videoElement.setAttribute("crossorigin", "anonymous");
@@ -93,6 +109,8 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
type = "video/vimeo";
} else if (mimeType.mediaSubType == MediaSubType.mp4) {
type = "video/mp4";
} else if (mimeType == MimeType.mp3) {
type = "audio/mp3";
}
if (type != null) {
SourceElement se = Document.get().createSourceElement();
@@ -111,7 +129,7 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
}
}
public VideoElement getVideoElement() {
public Element getVideoElement() {
return videoElement;
}
@@ -191,7 +209,7 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
* @return <code>true</code> if the player is running in full screen mode, <code>false</code> otherwise
*/
public native boolean isFullscreen() /*-{
if(this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) {
if (this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) {
return false;
}
return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player.isFullscreen();
@@ -203,7 +221,7 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
* @return <code>true</code> if the player is paused, <code>false</code> if it is playing
*/
public native boolean paused() /*-{
if(this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) {
if (this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) {
return true;
}
return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player.paused();
@@ -225,55 +243,53 @@ public class VideoJSPlayer extends Widget implements RequiresResize {
native void _onLoad(boolean autoplay, boolean withPanorama, String messageThreeSixty) /*-{
var that = this;
var elemid = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::elementId;
var player = $wnd.videojs(
elemid,
{
"playsInline" : true,
"customControlsOnMobile" : true
}).ready(function() {
this.on('play', function() {
that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPlay()();
});
this.on('pause', function() {
that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPause()();
});
console.log("play: " + autoplay);
if (autoplay) {
this.play();
}
var player = $wnd.videojs(elemid, {
"playsInline" : true,
"customControlsOnMobile" : true
}).ready(function() {
this.on('play', function() {
that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPlay()();
});
if(withPanorama){
player.panorama({
showNotice:true,
autoMobileOrientation: true,
clickAndDrag: true,
clickToToggle: false,
NoticeMessage: messageThreeSixty,
backToVerticalCenter: false,
backToHorizonCenter: false,
this.on('pause', function() {
that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPause()();
});
console.log("play: " + autoplay);
if (autoplay) {
this.play();
}
});
if (withPanorama) {
player.panorama({
showNotice : true,
autoMobileOrientation : true,
clickAndDrag : true,
clickToToggle : false,
NoticeMessage : messageThreeSixty,
backToVerticalCenter : false,
backToHorizonCenter : false,
});
}
this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player = player;
}-*/;
private native void disposeNative() /*-{
var player = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player;
player.dispose();
var player = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player;
player.dispose();
}-*/;
private native void handleResize() /*-{
var player = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player;
var canvas = player.getChild('Canvas');
if(canvas){
if (canvas) {
canvas.handleResize();
}
}-*/;
public native void pause() /*-{
if(this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) {
if (this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) {
return;
}
return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player.pause();
@@ -15,7 +15,6 @@
transform: rotate(180deg) translateX(50%) translateZ(0) !important;
}
</ui:style>
<div class="{style.player}">
<video class="{style.player} video-js vjs-default-skin vjs-big-play-centered" ui:field="videoElement" preload="auto"></video>
<div ui:field="playerHolder" class="{style.player}">
</div>
</ui:UiBinder>
@@ -4,12 +4,12 @@ import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.media.shared.AbstractMediaPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.VideoSynchPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaSynchPlayer;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.gwt.client.player.Timer;
public class VideoJSSyncPlayer extends AbstractMediaPlayer implements VideoSynchPlayer, RequiresResize {
public class VideoJSSyncPlayer extends AbstractMediaPlayer implements MediaSynchPlayer, RequiresResize {
private VideoJSPlayer videoJsDelegate;
private EditFlag editFlag;
@@ -79,7 +79,7 @@ public class VideoJSSyncPlayer extends AbstractMediaPlayer implements VideoSynch
}
@Override
public Widget getWidget() {
public Widget asWidget() {
return videoJsDelegate;
}
@@ -5,18 +5,18 @@ import java.util.List;
import com.google.gwt.event.logical.shared.AttachEvent;
import com.google.gwt.event.logical.shared.AttachEvent.Handler;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.media.shared.AbstractMediaPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.VideoSynchPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.WithWidget;
import com.sap.sailing.gwt.ui.client.media.shared.MediaSynchPlayer;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.gwt.client.player.Timer;
public class VideoYoutubePlayer extends AbstractMediaPlayer implements VideoSynchPlayer, MediaSynchAdapter, WithWidget {
public class VideoYoutubePlayer extends AbstractMediaPlayer implements MediaSynchPlayer, MediaSynchAdapter, IsWidget {
private interface DeferredAction {
void execute();
@@ -245,7 +245,7 @@ public class VideoYoutubePlayer extends AbstractMediaPlayer implements VideoSync
}
@Override
public Widget getWidget() {
public Widget asWidget() {
return videoContainer;
}
@@ -3,16 +3,16 @@ package com.sap.sailing.gwt.ui.client.media.popup;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.Window;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.media.VideoContainer;
import com.sap.sailing.gwt.ui.client.media.MediaPlayerContainer;
import com.sap.sailing.gwt.ui.client.media.shared.AbstractMediaPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.VideoPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.MediaPlayer;
public abstract class PopoutWindowPlayer extends AbstractMediaPlayer implements VideoPlayer, VideoContainer {
public abstract class PopoutWindowPlayer extends AbstractMediaPlayer implements MediaPlayer, MediaPlayerContainer {
public interface PlayerCloseListener {
void playerClosed();
void setVideoContainer(VideoContainer videoContainer);
void setVideoContainer(MediaPlayerContainer videoContainer);
}
private final JavaScriptObject playerWindow;
@@ -36,29 +36,33 @@ public abstract class PopoutWindowPlayer extends AbstractMediaPlayer implements
protected abstract String getPlayerWindowUrl();
native JavaScriptObject openWindow(String url) /*-{
return $wnd.open(url, '_blank', "resizable=yes, scrollbars=no, toolbar=no, menubar=no, status=no, location=no, directories=no, personalbar=no, width=660, height=380");
return $wnd
.open(
url,
'_blank',
"resizable=yes, scrollbars=no, toolbar=no, menubar=no, status=no, location=no, directories=no, personalbar=no, width=660, height=380");
}-*/;
@Override
public native void shutDown() /*-{
var playerWindow = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!playerWindow.closed) {
playerWindow.close();
}
var playerWindow = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!playerWindow.closed) {
playerWindow.close();
}
}-*/;
native JavaScriptObject registerNativeStuff() /*-{
var that = this;
var window = that.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
window.onbeforeunload = function() {
that.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::onClosingPopup()();
}
window.parent.deferredPlayState = {
deferredIsPlaying: false,
deferredIsMuted: true,
deferredMediaTime: 0,
playbackSpeed: 1
};
var that = this;
var window = that.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
window.onbeforeunload = function() {
that.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::onClosingPopup()();
}
window.parent.deferredPlayState = {
deferredIsPlaying : false,
deferredIsMuted : true,
deferredMediaTime : 0,
playbackSpeed : 1
};
}-*/;
private void onClosingPopup() {
@@ -68,90 +72,89 @@ public abstract class PopoutWindowPlayer extends AbstractMediaPlayer implements
@Override
public native void playMedia() /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredIsPlaying = true;
} else {
window.parent.videoPlayer.play();
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredIsPlaying = true;
} else {
window.parent.videoPlayer.play();
}
}-*/;
@Override
public native void pauseMedia() /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredIsPlaying = false;
} else {
window.parent.videoPlayer.pause();
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredIsPlaying = false;
} else {
window.parent.videoPlayer.pause();
}
}-*/;
@Override
public native void setCurrentMediaTime(double mediaTime) /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredMediaTime = mediaTime;
} else {
window.parent.videoPlayer.setTime(mediaTime);
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredMediaTime = mediaTime;
} else {
window.parent.videoPlayer.setTime(mediaTime);
}
}-*/;
@Override
public native void setMuted(boolean muted) /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredIsMuted = muted;
} else {
window.parent.videoPlayer.setMuted(muted);
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredIsMuted = muted;
} else {
window.parent.videoPlayer.setMuted(muted);
}
}-*/;
@Override
public native boolean isMediaPaused() /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
return !window.parent.deferredPlayState.deferredIsPlaying;
} else {
return window.parent.videoPlayer.isPaused();
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
return !window.parent.deferredPlayState.deferredIsPlaying;
} else {
return window.parent.videoPlayer.isPaused();
}
}-*/;
@Override
public native double getDuration() /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
return NaN;
} else {
return window.parent.videoPlayer.getDuration();
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
return NaN;
} else {
return window.parent.videoPlayer.getDuration();
}
}-*/;
@Override
public native double getCurrentMediaTime() /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
return window.parent.deferredPlayState.deferredMediaTime;
} else {
return window.parent.videoPlayer.getTime();
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
return window.parent.deferredPlayState.deferredMediaTime;
} else {
return window.parent.videoPlayer.getTime();
}
}-*/;
@Override
public native void setPlaybackSpeed(double playbackSpeed) /*-{
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredPlaybackSpeed = playbackSpeed;
} else {
window.parent.videoPlayer.setPlaybackSpeed(playbackSpeed);
}
var window = this.@com.sap.sailing.gwt.ui.client.media.popup.PopoutWindowPlayer::playerWindow;
if (!window.parent.videoPlayer) {
window.parent.deferredPlayState.deferredPlaybackSpeed = playbackSpeed;
} else {
window.parent.videoPlayer.setPlaybackSpeed(playbackSpeed);
}
}-*/;
@Override
public VideoPlayer getVideoPlayer() {
public MediaPlayer getMediaPlayer() {
return this;
}
@@ -1,6 +1,6 @@
package com.sap.sailing.gwt.ui.client.media.popup;
import com.google.gwt.dom.client.VideoElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.user.client.Window;
@@ -25,7 +25,7 @@ public class VideoPopupWindow extends AbstractPopupWindow implements ContextMenu
String videoUrl = Window.Location.getParameter("url");
String mimeType = Window.Location.getParameter("mimetype");
isDebug = Window.Location.getParameter("gwt.codesvr") != null;
if (videoUrl != null) {
videoJSDelegate = new VideoJSPlayer(true, false);
videoJSDelegate.setVideo(MimeType.valueOf(mimeType), videoUrl);
@@ -36,21 +36,19 @@ public class VideoPopupWindow extends AbstractPopupWindow implements ContextMenu
}
}
native void initPlay(VideoElement videoElement) /*-{
var that = this;
var deferredPlayState = $wnd.deferredPlayState
if (deferredPlayState && !$wnd.videoPlayer) {
that.@com.sap.sailing.gwt.ui.client.media.popup.VideoPopupWindow::initPlayState(DZDZ)(deferredPlayState.deferredMediaTime, deferredPlayState.deferredIsMuted, deferredPlayState.deferredPlaybackSpeed, deferredPlayState.deferredIsPlaying);
}
native void initPlay(Element videoElement) /*-{
var that = this;
var deferredPlayState = $wnd.deferredPlayState
if (deferredPlayState && !$wnd.videoPlayer) {
that.@com.sap.sailing.gwt.ui.client.media.popup.VideoPopupWindow::initPlayState(DZDZ)(deferredPlayState.deferredMediaTime, deferredPlayState.deferredIsMuted, deferredPlayState.deferredPlaybackSpeed, deferredPlayState.deferredIsPlaying);
}
}-*/;
public void loadedmetadata() {
adjustWindowSize();
}
@Override
public void play() {
videoJSDelegate.play();
@@ -1,8 +1,9 @@
package com.sap.sailing.gwt.ui.client.media.shared;
import com.google.gwt.user.client.ui.IsWidget;
import com.sap.sailing.gwt.ui.client.media.MediaSynchAdapter;
public interface VideoSynchPlayer extends VideoPlayerWithWidget, MediaSynchAdapter {
public interface MediaSynchPlayer extends IsWidget, MediaPlayer, MediaSynchAdapter {
void setEditFlag(EditFlag editFlag);
@@ -1,5 +0,0 @@
package com.sap.sailing.gwt.ui.client.media.shared;
public interface VideoPlayer extends MediaPlayer {
}
@@ -1,6 +0,0 @@
package com.sap.sailing.gwt.ui.client.media.shared;
public interface VideoPlayerWithWidget extends VideoPlayer, WithWidget {
}
@@ -1,9 +0,0 @@
package com.sap.sailing.gwt.ui.client.media.shared;
import com.google.gwt.user.client.ui.Widget;
public interface WithWidget {
Widget getWidget();
}
@@ -17,13 +17,14 @@ import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.datamining.presentation.TabbedSailingResultsPresenter;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.UUIDDataMiningSession;
import com.sap.sse.datamining.ui.client.AnchorDataMiningSettingsControl;
import com.sap.sse.datamining.ui.client.CompositeResultsPresenter;
import com.sap.sse.datamining.ui.client.DataMiningService;
import com.sap.sse.datamining.ui.client.DataMiningServiceAsync;
import com.sap.sse.datamining.ui.client.DataMiningSettingsControl;
import com.sap.sse.datamining.ui.client.DataMiningSettingsInfoManager;
import com.sap.sse.datamining.ui.client.ResultsPresenter;
import com.sap.sse.datamining.ui.client.execution.SimpleQueryRunner;
import com.sap.sse.datamining.ui.client.selection.QueryDefinitionProviderWithControls;
import com.sap.sse.gwt.client.EntryPointHelper;
@@ -40,11 +41,8 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
public static final ComponentResources resources = GWT.create(ComponentResources.class);
private final DataMiningServiceAsync dataMiningService = GWT.create(DataMiningService.class);
private DataMiningSession session;
private QueryDefinitionProviderWithControls queryDefinitionProviderWithControls;
@Override
protected void doOnModuleLoad() {
Highcharts.ensureInjectedWithMore();
@@ -64,6 +62,8 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
authorizedContentDecorator.setPermissionToCheck(Permission.DATA_MINING,
SailingPermissionsForRoleProvider.INSTANCE);
authorizedContentDecorator.setContentWidgetFactory(new WidgetFactory() {
private QueryDefinitionProviderWithControls queryDefinitionProvider;
private SimpleQueryRunner queryRunner;
private final DataMiningSettingsInfoManager settingsManager = new DataMiningSettingsInfoManagerImpl(
getStringMessages());
@@ -71,26 +71,36 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
@Override
public Widget get() {
DataMiningSettingsControl settingsControl = new AnchorDataMiningSettingsControl(null, null);
ResultsPresenter<?> resultsPresenter = new TabbedSailingResultsPresenter(/*parent*/ null, /*context*/ null,
/*drillDownCallback*/ groupKey -> queryDefinitionProviderWithControls.drillDown(groupKey, queryRunner::runQuery),
getStringMessages());
DockLayoutPanel selectionDockPanel = new DockLayoutPanel(Unit.PX);
queryDefinitionProviderWithControls = new QueryDefinitionProviderWithControls(null, null, session,
CompositeResultsPresenter<?> resultsPresenter = new TabbedSailingResultsPresenter(/* parent */ null,
/* context */ null, /* drillDownCallback */ groupKey -> {
queryDefinitionProvider.drillDown(groupKey, () -> {
queryRunner.run(queryDefinitionProvider.getQueryDefinition());
});
}, getStringMessages());
resultsPresenter.addCurrentPresenterChangedListener(presenterId -> {
StatisticQueryDefinitionDTO queryDefinition = resultsPresenter.getQueryDefinition(presenterId);
if (queryDefinition != null) {
queryDefinitionProvider.applyQueryDefinition(queryDefinition);
}
});
queryDefinitionProvider = new QueryDefinitionProviderWithControls(null, null, session,
dataMiningService, DataMiningEntryPoint.this, settingsControl, settingsManager,
resultsPresenter);
selectionDockPanel.add(queryDefinitionProviderWithControls.getEntryWidget());
queryDefinition -> queryRunner.run(queryDefinition));
queryRunner = new SimpleQueryRunner(null, null, session, dataMiningService, DataMiningEntryPoint.this,
queryDefinitionProviderWithControls, resultsPresenter);
queryDefinitionProviderWithControls.addControl(queryRunner.getEntryWidget());
queryDefinitionProvider, resultsPresenter);
queryDefinitionProvider.addControl(queryRunner.getEntryWidget());
/*
* Running queries automatically when they've been changed is currently unnecessary, if not even
* counterproductive. This removes the query runner settings to prevent that the user can enable the
* automatic execution of queries. Re-enable this, when this functionality is desired again.
*/
// settingsControl.addSettingsComponent(queryRunner);
SplitLayoutPanel splitPanel = new SplitLayoutPanel(10);
splitPanel.addSouth(resultsPresenter.getEntryWidget(), 350);
splitPanel.add(selectionDockPanel);
splitPanel.add(queryDefinitionProvider.getEntryWidget());
return splitPanel;
}
});
@@ -1,7 +1,7 @@
package com.sap.sailing.gwt.ui.datamining.presentation;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DoubleBox;
@@ -25,7 +25,7 @@ public class ManeuverSpeedDetailsChartConfigurationPanel extends HorizontalPanel
private static final String NUMBER_BOX_WIDTH = "40px";
public ManeuverSpeedDetailsChartConfigurationPanel(ClickHandler applyButtonClickHandler,
public ManeuverSpeedDetailsChartConfigurationPanel(Runnable applyConfigurationCallback,
StringMessages stringMessages) {
setHorizontalAlignment(ALIGN_LEFT);
setVerticalAlignment(ALIGN_MIDDLE);
@@ -48,7 +48,7 @@ public class ManeuverSpeedDetailsChartConfigurationPanel extends HorizontalPanel
add(new Label(stringMessages.zeroTo360AxisLabeling() + ":"));
add(zeroTo360AxisLabelingCheckBox);
Button applyButton = new Button(stringMessages.apply(), applyButtonClickHandler);
Button applyButton = new Button(stringMessages.apply(), (ClickEvent e) -> applyConfigurationCallback.run());
add(applyButton);
}
@@ -40,11 +40,11 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
private final DockLayoutPanel dockLayoutPanel;
private Chart polarChart;
private final Chart polarChart;
private final SimpleLayoutPanel polarChartWrapperPanel;
private Chart lineChart;
private Chart dataCountHistogramChart;
private final Chart lineChart;
private final Chart dataCountHistogramChart;
private final DockLayoutPanel rightSideChartsWrapperPanel;
private final ManeuverSpeedDetailsChartConfigurationPanel chartConfigPanel;
@@ -52,39 +52,25 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
private Integer minDataCount;
private Double minValue;
private Double maxValue;
private boolean zeroTo360AxisLabeling = false;
private int xAxisMin;
private int xAxisMax;
private QueryResultDTO<?> result;
public ManeuverSpeedDetailsResultsPresenter(Component<?> parent, ComponentContext<?> context,
StringMessages stringMessages) {
super(parent, context, stringMessages);
xAxisMin = -179;
xAxisMax = 180;
chartConfigPanel = new ManeuverSpeedDetailsChartConfigurationPanel(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
minDataCount = chartConfigPanel.getMinDataCount();
minValue = chartConfigPanel.getMinValue();
maxValue = chartConfigPanel.getMaxValue();
zeroTo360AxisLabeling = chartConfigPanel.isZeroTo360AxisLabeling();
if (result != null) {
redrawAllCharts();
}
}
}, stringMessages);
chartConfigPanel = new ManeuverSpeedDetailsChartConfigurationPanel(this::applyConfiguration, stringMessages);
addControl(chartConfigPanel);
ChartToCsvExporter chartToCsvExporter = new ChartToCsvExporter(stringMessages.csvCopiedToClipboard());
Button exportStatisticsCurveToCsvButton = new Button(stringMessages.exportStatisticsCurveToCsv(),
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
chartToCsvExporter.exportChartAsCsvToClipboard(lineChart);
@@ -92,6 +78,8 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
});
addControl(exportStatisticsCurveToCsvButton);
polarChart = ChartFactory.createPolarChart();
polarChart.getXAxis().setMin(xAxisMin).setMax(xAxisMax);
polarChartWrapperPanel = new SimpleLayoutPanel() {
@Override
public void onResize() {
@@ -99,11 +87,13 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
polarChart.redraw();
}
};
polarChartWrapperPanel.add(polarChart);
lineChart = ChartFactory.createLineChartForPolarData(stringMessages);
lineChart.getXAxis().setMin(xAxisMin).setMax(xAxisMax);
dataCountHistogramChart = ChartFactory.createDataCountHistogramChart(
stringMessages.TWA() + " (" + stringMessages.degreesShort() + ")", stringMessages);
dataCountHistogramChart.getXAxis().setMin(-179);
dataCountHistogramChart.getXAxis().setMax(180);
dataCountHistogramChart.getXAxis().setMin(xAxisMin).setMax(xAxisMax);
rightSideChartsWrapperPanel = new DockLayoutPanel(Unit.PCT) {
@Override
public void onResize() {
@@ -113,40 +103,27 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
dataCountHistogramChart.redraw();
}
};
rightSideChartsWrapperPanel.addNorth(lineChart, 50);
rightSideChartsWrapperPanel.addSouth(dataCountHistogramChart, 50);
dockLayoutPanel = new DockLayoutPanel(Unit.PCT);
dockLayoutPanel.addWest(polarChartWrapperPanel, 40);
dockLayoutPanel.addEast(rightSideChartsWrapperPanel, 60);
redrawAllCharts();
}
private void redrawAllCharts() {
if (polarChart != null) {
polarChartWrapperPanel.remove(polarChart);
}
if (lineChart != null) {
rightSideChartsWrapperPanel.remove(lineChart);
}
if (dataCountHistogramChart != null) {
rightSideChartsWrapperPanel.remove(dataCountHistogramChart);
}
int xAxisMin = zeroTo360AxisLabeling ? 0 : -179;
int xAxisMax = zeroTo360AxisLabeling ? 359 : 180;
polarChart = ChartFactory.createPolarChart();
lineChart = ChartFactory.createLineChartForPolarData(stringMessages);
dataCountHistogramChart = ChartFactory.createDataCountHistogramChart(
stringMessages.TWA() + " (" + stringMessages.degreesShort() + ")", stringMessages);
private void applyConfiguration() {
minDataCount = chartConfigPanel.getMinDataCount();
minValue = chartConfigPanel.getMinValue();
maxValue = chartConfigPanel.getMaxValue();
boolean zeroTo360AxisLabeling = chartConfigPanel.isZeroTo360AxisLabeling();
xAxisMin = zeroTo360AxisLabeling ? 0 : -179;
xAxisMax = zeroTo360AxisLabeling ? 359 : 180;
polarChart.getXAxis().setMin(xAxisMin).setMax(xAxisMax);
lineChart.getXAxis().setMin(xAxisMin).setMax(xAxisMax);
dataCountHistogramChart.getXAxis().setMin(xAxisMin).setMax(xAxisMax);
polarChartWrapperPanel.add(polarChart);
rightSideChartsWrapperPanel.addNorth(lineChart, 50);
rightSideChartsWrapperPanel.addSouth(dataCountHistogramChart, 50);
if (result != null) {
internalShowResults(result);
}
@@ -159,6 +136,10 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
@Override
protected void internalShowResults(QueryResultDTO<?> result) {
polarChart.removeAllSeries(false);
lineChart.removeAllSeries(false);
dataCountHistogramChart.removeAllSeries(false);
this.result = result;
Map<GroupKey, ?> results = result.getResults();
List<GroupKey> sortedNaturally = new ArrayList<GroupKey>(results.keySet());
@@ -176,8 +157,6 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
Series polarSeries = polarChart.createSeries();
Series histogramSeries = dataCountHistogramChart.createSeries();
Series valueSeries = lineChart.createSeries();
int xAxisMin = zeroTo360AxisLabeling ? 0 : -179;
int xAxisMax = zeroTo360AxisLabeling ? 359 : 180;
for (int convertedTWA = xAxisMin; convertedTWA <= xAxisMax; convertedTWA++) {
int i = convertedTWA < 0 ? convertedTWA + 360 : convertedTWA;
double value = valuePerTWA[i];
@@ -199,8 +178,11 @@ public class ManeuverSpeedDetailsResultsPresenter extends AbstractSailingResults
histogramSeries.setVisible(false, false);
valueSeries.setVisible(false, false);
lineChart.addSeries(valueSeries, false, false);
dataCountHistogramChart.addSeries(histogramSeries);
dataCountHistogramChart.addSeries(histogramSeries, false, false);
}
polarChart.redraw();
lineChart.redraw();
dataCountHistogramChart.redraw();
// Initially resize the chart. Otherwise it's too big. FIXME with a better solution
Timer timer = new Timer() {
@@ -5,6 +5,7 @@ import java.util.Map;
import java.util.Map.Entry;
import org.moxieapps.gwt.highcharts.client.Chart;
import org.moxieapps.gwt.highcharts.client.ChartSubtitle;
import org.moxieapps.gwt.highcharts.client.ChartTitle;
import org.moxieapps.gwt.highcharts.client.Color;
import org.moxieapps.gwt.highcharts.client.Credits;
@@ -61,7 +62,8 @@ public class NumberPairResultsPresenter extends AbstractSailingResultsPresenter<
.setBorderColor(new Color("#F0AB00"))
.setPlotBorderWidth(0)
.setCredits(new Credits().setEnabled(false))
.setChartTitle(new ChartTitle().setText(getDataMiningStringMessages().dataMiningResult()));
.setChartTitle(new ChartTitle().setText(""))
.setChartSubtitle(new ChartSubtitle().setText(""));
chart.setExporting(new Exporting().setEnabled(false));
chart.getXAxis().setAllowDecimals(false);
chart.getYAxis().setAxisTitleText("");
@@ -84,6 +86,9 @@ public class NumberPairResultsPresenter extends AbstractSailingResultsPresenter<
@Override
protected void internalShowResults(QueryResultDTO<?> res) {
chart.removeAllSeries(false);
seriesMappedByGroupKey.clear();
result = res;
createAndAddSeriesToChart();
for (Entry<GroupKey, ?> resultEntry : result.getResults().entrySet()) {
@@ -19,16 +19,17 @@ public class TabbedSailingResultsPresenter extends TabbedResultsPresenter {
DrillDownCallback drillDownCallback, StringMessages stringMessages) {
super(parent, context, drillDownCallback);
registerResultsPresenter(PolarAggregation.class,
new PolarResultsPresenter(TabbedSailingResultsPresenter.this, getComponentContext(), stringMessages));
registerResultsPresenter(PolarAggregation.class, new ResultsPresenterFactory<>(PolarResultsPresenter.class,
() -> new PolarResultsPresenter(this, getComponentContext(), stringMessages)));
registerResultsPresenter(PolarBackendData.class, new PolarBackendResultsPresenter(
TabbedSailingResultsPresenter.this, getComponentContext(), stringMessages));
registerResultsPresenter(PolarBackendData.class, new ResultsPresenterFactory<>(PolarBackendResultsPresenter.class,
() -> new PolarBackendResultsPresenter(this, getComponentContext(), stringMessages)));
registerResultsPresenter(ManeuverSpeedDetailsAggregation.class, new ManeuverSpeedDetailsResultsPresenter(
TabbedSailingResultsPresenter.this, getComponentContext(), stringMessages));
registerResultsPresenter(ManeuverSpeedDetailsAggregation.class,
new ResultsPresenterFactory<>(ManeuverSpeedDetailsResultsPresenter.class,
() -> new ManeuverSpeedDetailsResultsPresenter(this, getComponentContext(), stringMessages)));
registerResultsPresenter(PairWithStats.class, new NumberPairResultsPresenter(TabbedSailingResultsPresenter.this,
getComponentContext(), stringMessages));
registerResultsPresenter(PairWithStats.class, new ResultsPresenterFactory<>(NumberPairResultsPresenter.class,
() -> new NumberPairResultsPresenter(this, getComponentContext(), stringMessages)));
}
}
@@ -108,6 +108,10 @@ public class PolarBackendResultsPresenter extends AbstractSailingResultsPresente
@Override
protected void internalShowResults(QueryResultDTO<?> result) {
polarChart.removeAllSeries(false);
speedChart.removeAllSeries(false);
angleChart.removeAllSeries(false);
final Set<Series> seriesToHideAfterRendering = new HashSet<>();
Map<GroupKey, ?> results = result.getResults();
List<GroupKey> sortedNaturally = new ArrayList<GroupKey>(results.keySet());
@@ -167,8 +171,9 @@ public class PolarBackendResultsPresenter extends AbstractSailingResultsPresente
Series polarSeries = polarChart.createSeries();
polarSeries.setName(key.asString() + "-" + i + "kn");
double[][] data = aggregation.getPolarDataPerWindspeedAndAngle();
for (int j = 0; j < 360; j++) {
int convertedAngle = j > 180 ? j - 360 : j;
// Ensure that the points are added with ascending x coordinates to prevent Highcharts error 15
for (int convertedAngle = -179; convertedAngle <= 180; convertedAngle++) {
int j = convertedAngle < 0 ? convertedAngle + 360 : convertedAngle;
polarSeries.addPoint(convertedAngle, hasDataForAngle[j] ? data[j][i] : 0, false, false, false);
}
if (i != 11) {
@@ -6,7 +6,6 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.moxieapps.gwt.highcharts.client.Chart;
import org.moxieapps.gwt.highcharts.client.Point;
@@ -113,7 +112,6 @@ public class PolarResultsPresenter extends AbstractSailingResultsPresenter<Setti
Button exportStatisticsCurveToCsvButton = new Button(stringMessages.exportStatisticsCurveToCsv(),
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
chartToCsvExporter.exportChartAsCsvToClipboard(polarChart);
@@ -124,34 +122,6 @@ public class PolarResultsPresenter extends AbstractSailingResultsPresenter<Setti
setSeriesShowAndHideHandler();
}
private PointUnselectEventHandler createPointUnselectEventHandler() {
return new PointUnselectEventHandler() {
@Override
public boolean onUnselect(PointUnselectEvent pointUnselectEvent) {
long angle = pointUnselectEvent.getXAsLong();
Series series = polarChart.getSeries(pointUnselectEvent.getSeriesId());
Series seriesToHide = perAngleHistogramSeriesForAngle.get(series).get(angle);
seriesToHide.setVisible(false, true);
return true;
}
};
}
private PointSelectEventHandler createPointSelectEventHandler() {
return new PointSelectEventHandler() {
@Override
public boolean onSelect(PointSelectEvent pointSelectEvent) {
long angle = pointSelectEvent.getXAsLong();
Series series = polarChart.getSeries(pointSelectEvent.getSeriesId());
Series seriesToHide = perAngleHistogramSeriesForAngle.get(series).get(angle);
seriesToHide.setVisible(true, true);
return true;
}
};
}
private void setSeriesShowAndHideHandler() {
SeriesPlotOptions seriesPlotOptions = new SeriesPlotOptions();
seriesPlotOptions.setSeriesShowEventHandler(createSeriesShowEventHandler());
@@ -162,9 +132,38 @@ public class PolarResultsPresenter extends AbstractSailingResultsPresenter<Setti
polarChart.setSeriesPlotOptions(seriesPlotOptions);
}
private PointUnselectEventHandler createPointUnselectEventHandler() {
return new PointUnselectEventHandler() {
@Override
public boolean onUnselect(PointUnselectEvent pointUnselectEvent) {
long angle = pointUnselectEvent.getXAsLong();
Series series = polarChart.getSeries(pointUnselectEvent.getSeriesId());
Series seriesToHide = perAngleHistogramSeriesForAngle.get(series).get(angle);
if (seriesToHide != null) {
seriesToHide.setVisible(false, true);
}
return true;
}
};
}
private PointSelectEventHandler createPointSelectEventHandler() {
return new PointSelectEventHandler() {
@Override
public boolean onSelect(PointSelectEvent pointSelectEvent) {
long angle = pointSelectEvent.getXAsLong();
Series series = polarChart.getSeries(pointSelectEvent.getSeriesId());
Series seriesToShow = perAngleHistogramSeriesForAngle.get(series).get(angle);
if (seriesToShow != null) {
seriesToShow.setVisible(true, true);
}
return true;
}
};
}
private SeriesShowEventHandler createSeriesShowEventHandler() {
return new SeriesShowEventHandler() {
@Override
public boolean onShow(SeriesShowEvent seriesShowEvent) {
String id = seriesShowEvent.getSeriesId();
@@ -178,7 +177,6 @@ public class PolarResultsPresenter extends AbstractSailingResultsPresenter<Setti
private SeriesHideEventHandler createSeriesHideEventHandler() {
return new SeriesHideEventHandler() {
@Override
public boolean onHide(SeriesHideEvent seriesHideEvent) {
String id = seriesHideEvent.getSeriesId();
@@ -197,6 +195,12 @@ public class PolarResultsPresenter extends AbstractSailingResultsPresenter<Setti
@Override
protected void internalShowResults(QueryResultDTO<?> result) {
polarChart.removeAllSeries(false);
dataCountHistogramChart.removeAllSeries(false);
dataCountPerAngleHistogramChart.removeAllSeries(false);
histogramSeriesForPolarSeries.clear();
perAngleHistogramSeriesForAngle.clear();
Map<GroupKey, ?> results = result.getResults();
List<GroupKey> sortedNaturally = new ArrayList<GroupKey>(results.keySet());
Collections.sort(sortedNaturally, new Comparator<GroupKey>() {
@@ -218,33 +222,39 @@ public class PolarResultsPresenter extends AbstractSailingResultsPresenter<Setti
Map<Integer, Map<Double, Integer>> histogramData = aggregation.getCountHistogramPerAngle();
Map<Long, Series> seriesPerAngle = new HashMap<>();
perAngleHistogramSeriesForAngle.put(polarSeries, seriesPerAngle);
for (int i = 0; i < 360; i++) {
int convertedAngle = i > 180 ? i - 360 : i;
double speed = speedsPerAngle[i];
// Ensure that the points are added with ascending x coordinates to prevent Highcharts error 15
for (int convertedAngle = -179; convertedAngle <= 180; convertedAngle++) {
int index = convertedAngle < 0 ? convertedAngle + 360 : convertedAngle;
double speed = speedsPerAngle[index];
Point point = null;
if (countPerAngle[i] >= settings.getMinimumDataCountPerAngle() && speed != 0) {
if (countPerAngle[index] >= settings.getMinimumDataCountPerAngle() && speed != 0) {
point = new Point(convertedAngle, speed);
polarSeries.addPoint(point, false, false, false);
} else {
polarSeries.addPoint(convertedAngle, 0, false, false, false);
}
histogramSeries.addPoint(convertedAngle, countPerAngle[i], false, false, false);
Series dataCountPerAngleSeries = dataCountPerAngleHistogramChart.createSeries();
Map<Double, Integer> histogramDataForAngle = histogramData.get(i);
for (Entry<Double, Integer> entry : histogramDataForAngle.entrySet()) {
dataCountPerAngleSeries.addPoint(entry.getKey(), entry.getValue());
}
dataCountPerAngleHistogramChart.addSeries(dataCountPerAngleSeries, false, false);
dataCountPerAngleSeries.setVisible(false, false);
histogramSeries.addPoint(convertedAngle, countPerAngle[index], false, false, false);
if (point != null) {
Map<Double, Integer> histogramDataForAngle = histogramData.get(index);
Series dataCountPerAngleSeries = dataCountPerAngleHistogramChart.createSeries();
// Iterating over the histogram data without sorting the x coordinates ascending leads
// to a massive occurrence of Highcharts error 15, freezing the complete UI
List<Double> sortedAngles = new ArrayList<>(histogramDataForAngle.keySet());
Collections.sort(sortedAngles);
for (Double angle : sortedAngles) {
dataCountPerAngleSeries.addPoint(angle, histogramDataForAngle.get(angle));
}
dataCountPerAngleHistogramChart.addSeries(dataCountPerAngleSeries, false, false);
dataCountPerAngleSeries.setVisible(false, false);
seriesPerAngle.put((long) convertedAngle, dataCountPerAngleSeries);
}
}
polarSeries.setName(key.asString());
histogramSeries.setName(key.asString());
polarChart.addSeries(polarSeries, false, false);
histogramSeries.setVisible(false, false);
histogramSeriesForPolarSeries.put(polarSeries, histogramSeries);
polarChart.addSeries(polarSeries, false, false);
dataCountHistogramChart.addSeries(histogramSeries);
for (Series seriesToHide : seriesPerAngle.values()) {
seriesToHide.setVisible(false, false);
@@ -461,17 +461,23 @@ public class RaceBoardPanel
protected void updateRaceTimePanelOverlay() {
ArrayList<BarOverlay> overlays = new ArrayList<BarOverlay>();
Set<MediaTrack> playing = mediaPlayerManagerComponent.getPlayingVideoTracks();
Set<MediaTrack> videoPlaying = mediaPlayerManagerComponent.getPlayingVideoTracks();
Set<MediaTrack> audioPlaying = mediaPlayerManagerComponent.getPlayingAudioTrack();
for (MediaTrack track : mediaPlayerManagerComponent.getAssignedMediaTracks()) {
double start = track.startTime.asMillis();
TimePoint endTp = track.deriveEndTime();
double end;
if (endTp == null) {
end = Double.MAX_VALUE;
} else {
end = endTp.asMillis();
// do not show bars for very short videos but show for live streaming ones
if (track.duration == null || track.duration.asMinutes() > 1) {
TimePoint endTp = track.deriveEndTime();
double end;
if (endTp == null) {
end = Double.MAX_VALUE;
} else {
end = endTp.asMillis();
}
final boolean isPlaying = videoPlaying.contains(track) || audioPlaying.contains(track);
overlays.add(new BarOverlay(start, end, isPlaying,
track.title));
}
overlays.add(new BarOverlay(start, end, playing.contains(track), track.title));
}
racetimePanel.setBarOverlays(overlays);
}
@@ -84,6 +84,14 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ));
return getDataMiningServer().getComponentsChangedTimepoint();
}
@Override
public FunctionDTO getIdentityFunction(String localeInfoName) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ));
DataMiningServer server = getDataMiningServer();
Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
return dtoFactory.createFunctionDTO(server.getIdentityFunction(), server.getStringMessages(), locale);
}
@Override
public HashSet<FunctionDTO> getAllStatistics(String localeInfoName) {
@@ -103,6 +111,14 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
return functionsAsDTOs(statistics, localeInfoName);
}
@Override
public HashSet<AggregationProcessorDefinitionDTO> getAggregatorDefinitions(String localeInfoName) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ));
Iterable<AggregationProcessorDefinition<?, ?>> definitions = getDataMiningServer()
.getAllAggregationProcessorDefinitions();
return aggregatorDefinitionsAsDTOs(definitions, localeInfoName);
}
@Override
public HashSet<AggregationProcessorDefinitionDTO> getAggregatorDefinitionsFor(FunctionDTO extractionFunction,
String localeInfoName) {
@@ -348,6 +364,13 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
}
return predefinedQueryNames;
}
@Override
public StatisticQueryDefinitionDTO getPredefinedQueryDefinition(PredefinedQueryIdentifier identifier, String localeInfoName) {
SecurityUtils.getSubject().checkPermission(
Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ, identifier.getIdentifier()));
return localize(getDataMiningServer().getPredefinedQueryDefinitionDTO(identifier), localeInfoName);
}
@Override
public <ResultType extends Serializable> QueryResultDTO<ResultType> runPredefinedQuery(DataMiningSession session,
@@ -363,6 +386,16 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
}
return null;
}
@Override
public StatisticQueryDefinitionDTO localize(StatisticQueryDefinitionDTO queryDefinitionDTO, String localeInfoName) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ,
queryDefinitionDTO.getDataRetrieverChainDefinition().getName()));
DataMiningServer dataMiningServer = getDataMiningServer();
StatisticQueryDefinition<?, ?, ?, ?> queryDefinition = dataMiningServer.getQueryDefinitionForDTO(queryDefinitionDTO);
Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
return dtoFactory.createQueryDefinitionDTO(queryDefinition, dataMiningServer.getStringMessages(), locale, localeInfoName);
}
@Override
public SerializationDummy pseudoMethodSoThatSomeClassesAreAddedToTheGWTSerializationPolicy() {
@@ -11,6 +11,7 @@ import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.TextMetrics;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.controls.ControlPosition;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -18,6 +19,7 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.gwt.ui.actions.GetWindInfoAction;
import com.sap.sailing.gwt.ui.client.NumberFormatterFactory;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.racemap.CoordinateSystem;
@@ -29,6 +31,7 @@ import com.sap.sailing.gwt.ui.simulator.racemap.MovingCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.streamlets.Swarm;
import com.sap.sailing.gwt.ui.simulator.streamlets.VectorField;
import com.sap.sailing.gwt.ui.simulator.streamlets.WindInfoForRaceVectorField;
import com.sap.sse.common.ColorMapperChangedListener;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.Notification;
import com.sap.sse.gwt.client.Notification.NotificationType;
@@ -44,13 +47,12 @@ import com.sap.sse.gwt.client.player.Timer;
* @author Axel Uhl (D043530)
*
*/
public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay implements ColorMapperChangedListener{
public static final String LOAD_WIND_STREAMLET_DATA_CATEGORY = "loadWindStreamletData";
private static final int animationIntervalMillis = 40;
private static final long RESOLUTION_IN_MILLIS = 5000;
private static final int WIND_FETCH_INTERVAL_IN_MILLIS = 10000;
private static final int CHECK_WIND_SOURCE_INTERVAL_IN_MILLIS = 60000;
private boolean visible = false;
private final Timer timer;
private Swarm swarm;
@@ -63,9 +65,10 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
private final Scheduler scheduler;
private Canvas streamletLegend;
private boolean firstColoring = true;
private boolean colored;
private long latitudeCount;
private double latitudeSum;
private final NumberFormat numberFormatOneDecimal = NumberFormatterFactory.getDecimalFormat(1);
public WindStreamletsRaceboardOverlay(MapWidget map, int zIndex, final Timer timer,
RegattaAndRaceIdentifier raceIdentifier, SailingServiceAsync sailingService,
@@ -86,7 +89,7 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
getCanvas().getElement().setId("swarm-display");
createStreamletLegend(map);
}
public double getAverageLatitudeDeg() {
return latitudeCount > 0 ? latitudeSum/latitudeCount : 0;
}
@@ -108,19 +111,6 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
private void createStreamletLegend(MapWidget map) {
streamletLegend = Canvas.createIfSupported();
streamletLegend.addStyleName("MapStreamletLegend");
//streamletLegend.setTitle(stringMessages.simulationLegendTooltip());
/*streamletLegend.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int clickPixelY = event.getRelativeY(streamletLegend.getElement());
int legendRow = clickPixelY / ((int) rectHeight);
int pathRow = legendRow - (racePath!=null ? 1 : 0);
//Window.alert("clickPixelY: " + clickPixelY + "\nlegendRow: " + legendRow);
visiblePaths[pathRow] = !visiblePaths[pathRow];
clearCanvas();
drawPaths();
}
});*/
map.setControls(ControlPosition.LEFT_BOTTOM, streamletLegend);
int canvasWidth = 500;
int canvasHeight = 60;
@@ -128,51 +118,69 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
streamletLegend.setWidth(String.valueOf(canvasWidth));
streamletLegend.setHeight(String.valueOf(canvasHeight));
streamletLegend.setCoordinateSpaceWidth(canvasWidth);
streamletLegend.setCoordinateSpaceHeight(canvasHeight); }
streamletLegend.setCoordinateSpaceHeight(canvasHeight);
}
private void drawLegend() {
double x, y;
x=100;
y=16;
double w = 1;
double h = 20;
int maxIdx = 300;
Context2d context2d = streamletLegend.getContext2d();
context2d.setFillStyle("rgba(0,0,0,.3)");
context2d.setLineWidth(1.0);
context2d.beginPath();
context2d.fillRect(x-7.0, y-16.0, w*maxIdx+15.0, 56.0);
context2d.closePath();
context2d.stroke();
context2d.setFillStyle("white");
String label = stringMessages.windSpeedInKnots();
TextMetrics txtmet;
txtmet = context2d.measureText(label);
context2d.fillText(label, x + (w*maxIdx - txtmet.getWidth())/2.0, y - 5.0);
for(int idx=0; idx <= maxIdx; idx++) {
//double speed = idx * 24.0 / maxIdx;
double speed = 4.0 + idx * 16.0 / maxIdx;
context2d.setFillStyle(windField.getColor(speed));
context2d.beginPath();
context2d.fillRect(x + idx*w, y, w, h);
context2d.closePath();
context2d.stroke();
if (Math.abs(speed % 2.0) < (12.0/maxIdx)) {
context2d.setStrokeStyle("white");
public void drawLegend() {
if (streamletLegend.isVisible()) {
streamletLegend.getContext2d().clearRect(0, 0, streamletLegend.getCoordinateSpaceWidth(),
streamletLegend.getCoordinateSpaceHeight());
if (swarm != null && swarm.isColored()) {
final double x = 100;
final double y = 16;
final double w = 1;
final double h = 20;
final double speed_max = swarm.getValueRange().getMaxRight();
final double speed_min = swarm.getValueRange().getMinLeft();
final double speed_spread = speed_max - speed_min;
final int scale_spread;
if (speed_spread < 0.5) {
scale_spread = 300;
}
else if (speed_spread < 1) {
scale_spread = 100;
}
else {
scale_spread = 50;
}
final int maxIdx = 300;
Context2d context2d = streamletLegend.getContext2d();
context2d.setFillStyle("rgba(0,0,0,.3)");
context2d.setLineWidth(1.0);
context2d.beginPath();
context2d.moveTo(x + idx*w, y + h);
context2d.lineTo(x + idx*w, y + h + 7.0);
context2d.fillRect(x - 10.0, y - 16.0, w * maxIdx + 20.0, 56.0);
context2d.closePath();
context2d.stroke();
context2d.setFillStyle("white");
label = ""+Math.round(speed);
String label = stringMessages.windSpeedInKnots();
TextMetrics txtmet;
txtmet = context2d.measureText(label);
context2d.fillText(label, x + idx*w - txtmet.getWidth()/2.0, y + h + 8.0 + 8.0);
context2d.fillText(label, x + (w * maxIdx - txtmet.getWidth()) / 2.0, y - 5.0);
for (int idx = 0; idx <= maxIdx; idx++) {
final double speedSteps = speed_min + idx * (speed_spread) / maxIdx;
context2d.setFillStyle(swarm.getColorMapper().getColor(speedSteps));
context2d.beginPath();
context2d.fillRect(x + idx * w, y, w, h);
context2d.closePath();
context2d.stroke();
if (idx % scale_spread == 0) {
context2d.setStrokeStyle("white");
context2d.setLineWidth(1.0);
context2d.beginPath();
context2d.moveTo(x + idx * w, y + h);
context2d.lineTo(x + idx * w, y + h + 7.0);
context2d.closePath();
context2d.stroke();
context2d.setFillStyle("white");
label = numberFormatOneDecimal.format(speedSteps);
txtmet = context2d.measureText(label);
context2d.fillText(label, x + idx * w - txtmet.getWidth() / 2.0, y + h + 8.0 + 8.0);
}
}
}
}
}
public void startStreamlets() {
scheduleWindDataRefresh();
if (swarm == null) {
@@ -180,9 +188,11 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
this.swarm = new Swarm(this, map, timer, windField, new StreamletParameters());
}
initCanvasOrigin();
this.swarm.setColors(colored);
this.swarm.start(animationIntervalMillis);
this.swarm.getColorMapper().addListener(this);
}
private void scheduleWindDataRefresh() {
scheduler.scheduleFixedPeriod(new RepeatingCommand() {
@Override
@@ -201,10 +211,11 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
// Now run things once, first updating the wind sources, then grabbing the wind from those sources:
updateWindSourcesToObserve(new Runnable() { @Override public void run() { updateWindField(); } });
}
private void stopStreamlets() {
if (swarm != null) {
if (this.swarm != null) {
this.swarm.stop();
this.swarm.getColorMapper().removeListener(this);
}
}
@@ -218,10 +229,8 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
sailingService.getWindSourcesInfo(raceIdentifier, new MarkedAsyncCallback<>(new AsyncCallback<WindInfoForRaceDTO>() {
@Override
public void onFailure(Throwable caught) {
Notification.notify(stringMessages.errorFetchingWindStreamletData(caught.getMessage()),
NotificationType.WARNING);
Notification.notify(stringMessages.errorFetchingWindStreamletData(caught.getMessage()), NotificationType.WARNING);
}
@Override
public void onSuccess(WindInfoForRaceDTO result) {
windInfoForRace.raceIsKnownToStartUpwind = result.raceIsKnownToStartUpwind;
@@ -261,7 +270,6 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
Notification.notify(stringMessages.errorFetchingWindStreamletData(caught.getMessage()),
NotificationType.WARNING);
}
@Override
public void onSuccess(WindInfoForRaceDTO result) {
updateAverageLatitudeDeg(result);
@@ -288,23 +296,23 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
}
}));
}
@Override
public boolean isVisible() {
return this.visible;
}
@Override
public void setVisible(boolean isVisible) {
if (getCanvas() != null) {
if (isVisible) {
if (this.windField.getColors()) {
this.streamletLegend.setVisible(true);
}
this.startStreamlets();
this.visible = isVisible;
if (this.swarm.isColored()) {
this.streamletLegend.setVisible(true);
}
} else {
if (this.windField.getColors()) {
if (this.swarm.isColored()) {
this.streamletLegend.setVisible(false);
}
this.stopStreamlets();
@@ -312,29 +320,36 @@ public class WindStreamletsRaceboardOverlay extends MovingCanvasOverlay {
}
}
}
public void setColors(boolean isColored) {
this.windField.setColors(isColored);
this.colored = isColored;
if ((isColored) && (firstColoring)) {
firstColoring = false;
this.drawLegend();
}
this.streamletLegend.setVisible(isColored);
if (swarm != null) {
swarm.setColors(isColored);
}
}
@Override
public void removeFromMap() {
this.setVisible(false);
}
@Override
protected void drawCenterChanged() {
}
public void onBoundsChanged(boolean zoomChanged) {
if (swarm != null) {
int swarmPause = (zoomChanged ? 5 : 1);
swarm.onBoundsChanged(zoomChanged, swarmPause);
}
}
@Override
public void onColorMappingChanged() {
drawLegend();
}
}
@@ -45,16 +45,12 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
windFieldDTO = null;
getCanvas().getElement().setId("swarm-display");
}
public WindFieldDTO getWindFieldDTO() {
return this.windFieldDTO;
}
public WindFieldGenParamsDTO getWindParams() {
return this.windParams;
}
public void startStreamlets() {
if (swarm == null) {
final SimulatorField field = new SimulatorField(getWindFieldDTO(), getWindParams(), streamletPars, coordinateSystem);
@@ -63,27 +59,22 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
}
this.swarm.start(40);
}
public void stopStreamlets() {
if (swarm != null) {
this.swarm.stop();
}
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public void setWindField(final WindFieldDTO windFieldDTO) {
this.windFieldDTO = windFieldDTO;
this.swarm = null;
}
@Override
public boolean isVisible() {
return this.visible;
}
@Override
public void setVisible(boolean isVisible) {
if (getCanvas() != null) {
@@ -99,14 +90,12 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
}
}
}
@Override
public void addToMap() {
if (timer != null) {
timer.addTimeListener(this);
}
}
@Override
public void removeFromMap() {
if (timer != null) {
@@ -114,11 +103,9 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
}
this.setVisible(false);
}
@Override
protected void drawCenterChanged() {
}
@Override
protected void draw() {
super.draw();
@@ -135,15 +122,12 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
}
}
}
public Swarm getSwarm() {
return this.swarm;
}
@Override
public void timeChanged(final Date newDate, Date oldDate) {
}
@Override
public boolean shallStop() {
if (timer.getTime().getTime() >= this.endDate.getTime()) {
@@ -29,13 +29,11 @@ public class RectField implements VectorField {
private final double maxLength;
private final double particleFactor;
private final String[] colorsForSpeeds;
private final CoordinateSystem coordinateSystem;
public RectField(Vector[][] field, double x0, double y0, double x1, double y1, StreamletParameters parameters, CoordinateSystem coordinateSystem) {
this.coordinateSystem = coordinateSystem;
colorsForSpeeds = createColorsForSpeeds();
this.x0 = x0;
this.x1 = x1;
this.y0 = y0;
@@ -147,26 +145,6 @@ public class RectField implements VectorField {
public double getParticleWeight(LatLng p, Vector v) {
return v == null ? 0 : (1.0 - v.length() / this.maxLength);
}
@Override
public String getColor(double speed) {
return colorsForSpeeds[getIntensity(speed)];
}
private String[] createColorsForSpeeds() {
String[] colors = new String[256];
double alpha = 1.0;
int greyValue = 255;
for (int i = 0; i < 256; i++) {
colors[i] = "rgba(" + (greyValue) + "," + (greyValue) + "," + (greyValue) + "," + (alpha * i / 255.0) + ")";
}
return colors;
}
private int getIntensity(double speed) {
double s = speed / maxLength;
return (int) Math.min(255, 90 + Math.round(350 * s));
}
@Override
public double getLineWidth(double speed) {
@@ -49,7 +49,6 @@ public class SimulatorField implements VectorField {
private final Position nvX;
private final double[][][] data;
private final String[] colorsForSpeeds;
private final Date startTime;
private final Duration timeStep;
private final CoordinateSystem coordinateSystem;
@@ -58,7 +57,6 @@ public class SimulatorField implements VectorField {
this.coordinateSystem = coordinateSystem;
this.startTime = windParams.getStartTime();
this.timeStep = windParams.getTimeStep();
this.colorsForSpeeds = createColorsForSpeeds();
this.rcStart = new DegreePosition(windData.windData.rcStart.getLatDeg(), windData.windData.rcStart.getLngDeg());
this.rcEnd = new DegreePosition(windData.windData.rcEnd.getLatDeg(), windData.windData.rcEnd.getLngDeg());
this.resX = windData.windData.resX;
@@ -228,38 +226,6 @@ public class SimulatorField implements VectorField {
return v == null ? 0 : (v.length() / this.maxLength + 0.1);
}
private String[] createColorsForSpeeds() {
String[] colors = new String[256];
double alphaMin = 0.0;
double alphaMax = 0.9;
int greyValue = 255;
for (int i = 0; i < 256; i++) {
colors[i] = "rgba(" + (greyValue) + "," + (greyValue) + "," + (greyValue) + ","
+ (alphaMin + (alphaMax - alphaMin) * i / 255.0) + ")";
}
return colors;
}
@Override
public String getColor(double speed) {
return colorsForSpeeds[getIntensity(speed)];
}
private int getIntensity(double speed) {
/*
* normalized intensity: speed == average wind speed => intensity 0.5 speed <= minimum wind speed => intensity
* 0.0 speed between 0.0 and 1.0 double s; if (minLength == maxLength) { s = 0.5; } else if (speed <= minLength)
* { s = 0.0; } else { s = (speed - minLength) / (maxLength - minLength); }
*/
/*
* absolute intensity speed == 12kn => intensity 0.7 speed == 20kn => intensity 1.0 speed == 0kn => intensity
* 0.25
*/
double s = 0.7 + 0.0375 * (speed - 12.0);
return (int) Math.max(0, Math.min(255, Math.round(255 * s)));
}
@Override
public double getLineWidth(double speed) {
/*
@@ -15,6 +15,8 @@ import com.sap.sailing.gwt.ui.client.shared.racemap.BoundsUtil;
import com.sap.sailing.gwt.ui.client.shared.racemap.CoordinateSystem;
import com.sap.sailing.gwt.ui.simulator.StreamletParameters;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sse.common.ColorMapper;
import com.sap.sse.common.ValueRangeFlexibleBoundaries;
import com.sap.sse.gwt.client.player.TimeListener;
public class Swarm implements TimeListener {
@@ -62,6 +64,10 @@ public class Swarm implements TimeListener {
private double cosineOfAverageLatitude;
private HandlerRegistration handlerRegistration;
private boolean colored = false;
private final ValueRangeFlexibleBoundaries valueRange;
private final ColorMapper colorMapper;
public Swarm(FullCanvasOverlay fullcanvas, MapWidget map, com.sap.sse.gwt.client.player.Timer timer,
VectorField vectorField, StreamletParameters streamletPars) {
@@ -74,8 +80,10 @@ public class Swarm implements TimeListener {
timePoint = timer.getTime();
cosineOfAverageLatitude = 1.0; // default to equator
diffPx = new Vector(0, 0);
valueRange = new ValueRangeFlexibleBoundaries(/*wind speed in knots*/ 0.0,/*wind speed in knots*/ 60.0, /*percentage*/ 0.15);
colorMapper = new ColorMapper(valueRange, !colored);
}
public void start(final int animationIntervalMillis) {
fullcanvas.setCanvasSettings();
// if map is not yet loaded, wait for it
@@ -91,7 +99,7 @@ public class Swarm implements TimeListener {
});
}
}
private void startWithMap(int animationIntervalMillis) {
projection = new Mercator(fullcanvas, map);
projection.calibrate();
@@ -100,11 +108,10 @@ public class Swarm implements TimeListener {
swarmContinue = true;
startLoop(animationIntervalMillis);
}
public void stop() {
swarmContinue = false;
}
private Particle createParticle() {
Particle particle = null;
boolean done = false;
@@ -113,7 +120,7 @@ public class Swarm implements TimeListener {
while (!done && attempts-- > 0) {
particle = new Particle();
particle.currentPosition = getRandomPosition();
if (field.inBounds(particle.currentPosition)) {
if(field.inBounds(particle.currentPosition)) {
Vector v = field.getVector(particle.currentPosition, timePoint);
double weight = field.getParticleWeight(particle.currentPosition, v);
if (weight >= Math.random()) {
@@ -145,7 +152,7 @@ public class Swarm implements TimeListener {
result = LatLng.newInstance(latDeg, lngDeg);
return result;
}
private Particle[] createParticles() {
Particle[] newParticles = new Particle[nParticles];
for (int idx = 0; idx < newParticles.length; idx++) {
@@ -153,7 +160,7 @@ public class Swarm implements TimeListener {
}
return newParticles;
}
public void onBoundsChanged(boolean zoomChanged, int swarmPause) {
this.zoomChanged |= zoomChanged;
if (this.zoomChanged) {
@@ -161,7 +168,7 @@ public class Swarm implements TimeListener {
}
this.swarmPause = swarmPause;
}
private void updateBounds() {
LatLngBounds fieldBounds = this.field.getFieldCorners();
final LatLngBounds mapBounds = map.getBounds();
@@ -174,12 +181,8 @@ public class Swarm implements TimeListener {
this.nParticles = (int)Math.round(Math.sqrt(boundsWidthpx * boundsHeightpx) * this.field.getParticleFactor() * this.parameters.swarmScale);
cosineOfAverageLatitude = Math.cos((visibleBoundsOfField.getSouthWest().getLatitude()/180.*Math.PI+
visibleBoundsOfField.getNorthEast().getLatitude()/180.*Math.PI)/2);
};
}
//native void log(String message) /*-{
// console.log( message );
//}-*/;
private void startLoop(final int animationIntervalMillis) {
// Create animation-loop based on timer timeout
loopTimer = new com.google.gwt.user.client.Timer() {
@@ -217,7 +220,7 @@ public class Swarm implements TimeListener {
};
loopTimer.schedule(animationIntervalMillis);
}
private void drawSwarm() {
Context2d ctxt = canvas.getContext2d();
ctxt.setGlobalAlpha(0.08);
@@ -234,19 +237,30 @@ public class Swarm implements TimeListener {
}
double particleSpeed = particle.v == null ? 0 : particle.v.length();
ctxt.setLineWidth(field.getLineWidth(particleSpeed));
ctxt.setStrokeStyle(field.getColor(particleSpeed));
ctxt.setStrokeStyle(colorMapper.getColor(particleSpeed));
ctxt.beginPath();
ctxt.moveTo(particle.previousPixelCoordinate.x, particle.previousPixelCoordinate.y);
ctxt.lineTo(particle.currentPixelCoordinate.x, particle.currentPixelCoordinate.y);
ctxt.stroke();
}
}
public void setColors(boolean isColored) {
this.colored = isColored;
colorMapper.setGrey(!isColored);
}
public boolean isColored() {
return colored;
}
/**
* Moves each particle by its vector {@link Particle#v} multiplied by the speed which is 0.01 times the
* {@link VectorField#getMotionScale(int)} at the map's current zoom level.
* {@link VectorField#getMotionScale(int)} at the map's current zoom level.
*/
private boolean execute(Vector diffPx) {
double minSpeedInKnots = 120.0;
double maxSpeedInKnots = 0.0;
double speed = field.getMotionScale(map.getZoom());
for (int idx = 0; idx < particles.length; idx++) {
Particle particle = particles[idx];
@@ -275,15 +289,34 @@ public class Swarm implements TimeListener {
// particle timed out (age became 0) or was never created (e.g., weight too low); try to create a new one
particles[idx] = this.createParticle();
}
if (particles[idx] != null && particles[idx].v != null) {
final double length = particles[idx].v.length();
if (length > maxSpeedInKnots) {
maxSpeedInKnots = length;
}
if (length < minSpeedInKnots) {
minSpeedInKnots = length;
}
}
}
if (Math.abs(maxSpeedInKnots - minSpeedInKnots) <= 0.01 && minSpeedInKnots < maxSpeedInKnots) {
valueRange.setMinMax(minSpeedInKnots - 0.1, maxSpeedInKnots + 0.1);
}
else if (minSpeedInKnots <= maxSpeedInKnots) {
valueRange.setMinMax(minSpeedInKnots, maxSpeedInKnots);
}
drawSwarm();
return true;
}
public VectorField getField() {
return field;
public ValueRangeFlexibleBoundaries getValueRange() {
return valueRange;
}
public ColorMapper getColorMapper() {
return colorMapper;
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
timePoint = newTime;
@@ -12,9 +12,6 @@ import com.sap.sailing.gwt.ui.client.shared.racemap.CoordinateSystem;
* A field of vectors to display in a streamlet {@link Swarm}. The {@link Vector}s returned by {@link #getVector(Position, Date)}
* are used to initialize {@link Particle}s. Their "speed" is the {@link Vector#length() length} of the vector.<p>
*
* This field provides color strings for each possible speed which are then used to style the particles as they fly through
* the swarm.
*
* @author Christopher Ronnewinkel (D036654)
* @author Axel Uhl (D043530)
*
@@ -83,14 +80,4 @@ public interface VectorField {
LatLngBounds getFieldCorners();
double getParticleFactor();
/**
* Computes a color for a particle flying at a certain speed.
*
* @param speed
* a speed as obtained by computing a {@link Vector}'s {@link Vector#length() length}.
* @return an RGB color with optional transparency that is a legal color in CSS. Example:
* <code>"rgba(1, 2, 3, 0.4)"</code>
*/
String getColor(double speed);
}
@@ -48,7 +48,6 @@ public class WindInfoForRaceVectorField implements VectorField, AverageLatitudeP
private double averageLatitudeCosine;
private double knotsInDegreePerFrame;
private final CoordinateSystem coordinateSystem;
private boolean colored = false;
private final Comparator<WindDTO> windByRequestTimePointComparator = new Comparator<WindDTO>() {
@Override
@@ -103,9 +102,6 @@ public class WindInfoForRaceVectorField implements VectorField, AverageLatitudeP
double knotSpeedSumScaledByConfidence = 0;
final BearingWithConfidenceCluster<Position> bearingCluster = new BearingWithConfidenceCluster<>(weigher);
for (final Entry<WindSource, WindTrackInfoDTO> windSourceAndWindTrack : windInfoForRace.windTrackInfoByWindSource.entrySet()) {
/*if ((windSourceAndWindTrack.getKey().name().equals("RACECOMMITTEE"))||(windSourceAndWindTrack.getKey().name().equals("COURSE_BASED"))) {
continue;
}*/
if (!Util.contains(windInfoForRace.windSourcesToExclude, windSourceAndWindTrack.getKey())) {
WindDTO timewiseClosestFixForWindSource = getTimewiseClosestFix(windSourceAndWindTrack.getValue(), at);
if (timewiseClosestFixForWindSource != null) {
@@ -215,35 +211,4 @@ public class WindInfoForRaceVectorField implements VectorField, AverageLatitudeP
public double getParticleFactor() {
return 0.5;
}
public void setColors(boolean isColored) {
this.colored = isColored;
}
public boolean getColors() {
return this.colored;
}
/**
* {@link #MAX_WIND_SPEED_IN_KNOTS maximum wind speed} is fully opaque; zero speed is fully transparent
*/
@Override
public String getColor(double speed) {
if (this.colored) {
double h;
if (speed <= 4.0) {
h = 240.0;
} else if (speed <= 12.0) {
h = 120.0 + (12.0 - speed) / (12.0 - 4.0) * (240.0 - 120.0);
} else if (speed <= 20.0) {
h = 0.0 + (20.0 - speed) / (20.0 - 12.0) * (120.0 - 0.0);
} else {
h = 0.0;
}
return "hsl(" + Math.round(h) + ", 100%, 50%)";
} else {
return "rgba(255,255,255," + Math.min(1.0, 0.5 + 0.6 * speed / MAX_WIND_SPEED_IN_KNOTS) + ")";
}
}
}
@@ -16,8 +16,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class BackendPolarsBoatClassRetrievalProcessor extends AbstractRetrievalProcessor<RacingEventService, HasBackendPolarBoatClassContext> {
public BackendPolarsBoatClassRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasBackendPolarBoatClassContext, ?>> resultReceivers, int retrievalLevel) {
super(RacingEventService.class, HasBackendPolarBoatClassContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasBackendPolarBoatClassContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(RacingEventService.class, HasBackendPolarBoatClassContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -16,8 +16,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class PolarCompetitorRetrievalProcessor extends AbstractRetrievalProcessor<HasLegPolarContext, HasCompetitorPolarContext> {
public PolarCompetitorRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasCompetitorPolarContext, ?>> resultReceivers, int retrievalLevel) {
super(HasLegPolarContext.class, HasCompetitorPolarContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasCompetitorPolarContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasLegPolarContext.class, HasCompetitorPolarContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -16,8 +16,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class PolarFleetRetrievalProcessor extends AbstractRetrievalProcessor<HasRaceColumnPolarContext, HasFleetPolarContext> {
public PolarFleetRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasFleetPolarContext, ?>> resultReceivers, int retrievalLevel) {
super(HasRaceColumnPolarContext.class, HasFleetPolarContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasFleetPolarContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasRaceColumnPolarContext.class, HasFleetPolarContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -38,8 +38,9 @@ public class PolarGPSFixRetrievalProcessor extends AbstractRetrievalProcessor<Ha
private final PolarDataMiningSettings settings;
public PolarGPSFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasGPSFixPolarContext, ?>> resultReceivers,
PolarDataMiningSettings settings, int retrievalLevel) {
super(HasCompetitorPolarContext.class, HasGPSFixPolarContext.class, executor, resultReceivers, retrievalLevel);
PolarDataMiningSettings settings, int retrievalLevel, String retrievedDataTypeMessageKey) {
super(HasCompetitorPolarContext.class, HasGPSFixPolarContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
this.settings = settings;
}
@@ -15,8 +15,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class PolarLeaderboardGroupRetrievalProcessor extends AbstractRetrievalProcessor<RacingEventService, HasLeaderboardGroupPolarContext> {
public PolarLeaderboardGroupRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasLeaderboardGroupPolarContext, ?>> resultReceivers, int retrievalLevel) {
super(RacingEventService.class, HasLeaderboardGroupPolarContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasLeaderboardGroupPolarContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(RacingEventService.class, HasLeaderboardGroupPolarContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -15,8 +15,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class PolarLeaderboardRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardGroupPolarContext, HasLeaderboardPolarContext> {
public PolarLeaderboardRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasLeaderboardPolarContext, ?>> resultReceivers, int retrievalLevel) {
super(HasLeaderboardGroupPolarContext.class, HasLeaderboardPolarContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasLeaderboardPolarContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasLeaderboardGroupPolarContext.class, HasLeaderboardPolarContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
@@ -20,8 +20,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class PolarLegRetrievalProcessor extends AbstractRetrievalProcessor<HasFleetPolarContext, HasLegPolarContext> {
public PolarLegRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasLegPolarContext, ?>> resultReceivers, int retrievalLevel) {
super(HasFleetPolarContext.class, HasLegPolarContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasLegPolarContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasFleetPolarContext.class, HasLegPolarContext.class, executor, resultReceivers, retrievalLevel,
retrievedDataTypeMessageKey);
}
@Override
@@ -16,8 +16,10 @@ import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class PolarRaceColumnRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardPolarContext, HasRaceColumnPolarContext> {
public PolarRaceColumnRetrievalProcessor(ExecutorService executor,
Collection<Processor<HasRaceColumnPolarContext, ?>> resultReceivers, int retrievalLevel) {
super(HasLeaderboardPolarContext.class, HasRaceColumnPolarContext.class, executor, resultReceivers, retrievalLevel);
Collection<Processor<HasRaceColumnPolarContext, ?>> resultReceivers, int retrievalLevel,
String retrievedDataTypeMessageKey) {
super(HasLeaderboardPolarContext.class, HasRaceColumnPolarContext.class, executor, resultReceivers,
retrievalLevel, retrievedDataTypeMessageKey);
}
@Override
Loaded 100 of 230 files, more files were not shown because too many files have changed in this diff. Show more