Merge branch 'master' into bug3612

This commit is contained in:
Axel Uhl committed 2016-08-16 14:28:07 +02:00
commit b6dd8c3838
53 files changed
+158 -112

No files matched your search

+10 -1
View File
@@ -28,7 +28,7 @@ echo "Installing GWT plugin..."
installPlugins http://storage.googleapis.com/gwt-eclipse-plugin/release com.google.gdt.eclipse.suite.e44.feature.feature.group
echo "Installing Android Tools..."
installPlugins https://dl.google.com/eclipse/plugin/4.5 com.android.ide.eclipse.adt.feature.feature.group
installPlugins https://dl-ssl.google.com/android/eclipse com.android.ide.eclipse.adt.feature.feature.group
echo "Installing GWT SDM debug bridge..."
installPlugins http://p2.sapsailing.com/p2/sdbg com.github.sdbg.feature.feature.group
@@ -36,10 +36,19 @@ installPlugins http://p2.sapsailing.com/p2/sdbg com.github.sdbg.feature.feature.
echo "Installing EasyShell..."
installPlugins http://anb0s.github.io/EasyShell com.tetrade.eclipse.plugins.easyshell.feature.feature.group
echo "Installing BIRT charts (requirement for MAT)..."
installPlugins http://download.eclipse.org/birt/update-site/4.6 org.eclipse.birt.chart.feature.group
echo "Installing Memory Analyzer..."
installPlugins http://download.eclipse.org/mat/1.6/update-site/ org.eclipse.mat.feature.feature.group,org.eclipse.mat.chart.feature.feature.group
echo "Installing latest version of Code Recommenders ..."
updatePlugins http://download.eclipse.org/recommenders/updates/stable/ org.eclipse.recommenders.rcp.feature.feature.group,org.eclipse.recommenders.mylyn.rcp.feature.feature.group,org.eclipse.recommenders.snipmatch.rcp.feature.feature.group
echo "Installing latest version of EGit ..."
updatePlugins http://download.eclipse.org/egit/updates org.eclipse.jgit.feature.group,org.eclipse.jgit.http.apache.feature.group,org.eclipse.egit.feature.group,org.eclipse.egit.mylyn.feature.group
echo "Installing latest version of Mylyn ..."
updatePlugins http://download.eclipse.org/mylyn/releases/latest org.eclipse.mylyn_feature.feature.group,org.eclipse.mylyn.bugzilla_feature.feature.group,org.eclipse.mylyn.builds.feature.group,org.eclipse.mylyn.commons.feature.group,org.eclipse.mylyn.commons.identity.feature.group,org.eclipse.mylyn.commons.notifications.feature.group,org.eclipse.mylyn.commons.repositories.feature.group,org.eclipse.mylyn.commons.repositories.http.feature.group,org.eclipse.mylyn.context_feature.feature.group,org.eclipse.mylyn.discovery.feature.group,org.eclipse.mylyn.gerrit.feature.feature.group,org.eclipse.mylyn.git.feature.group,org.eclipse.mylyn.hudson.feature.group,org.eclipse.mylyn.java_feature.feature.group,org.eclipse.mylyn.monitor.feature.group,org.eclipse.mylyn.reviews.feature.feature.group,org.eclipse.mylyn.team_feature.feature.group,org.eclipse.mylyn.versions.feature.group,org.eclipse.mylyn.wikitext_feature.feature.group
echo "Installation completed!"
+10 -1
View File
@@ -28,7 +28,7 @@ echo "Installing GWT plugin..."
installPlugins http://storage.googleapis.com/gwt-eclipse-plugin/release com.google.gdt.eclipse.suite.e44.feature.feature.group
echo "Installing Android Tools..."
installPlugins https://dl.google.com/eclipse/plugin/4.6 com.android.ide.eclipse.adt.feature.feature.group
installPlugins https://dl-ssl.google.com/android/eclipse com.android.ide.eclipse.adt.feature.feature.group
echo "Installing GWT SDM debug bridge..."
installPlugins http://p2.sapsailing.com/p2/sdbg com.github.sdbg.feature.feature.group
@@ -37,10 +37,19 @@ installPlugins http://p2.sapsailing.com/p2/sdbg com.github.sdbg.feature.feature.
# echo "Installing EasyShell..."
# installPlugins http://anb0s.github.io/EasyShell com.tetrade.eclipse.plugins.easyshell.feature.feature.group
echo "Installing BIRT charts (requirement for MAT)..."
installPlugins http://download.eclipse.org/birt/update-site/4.6 org.eclipse.birt.chart.feature.group
echo "Installing Memory Analyzer..."
installPlugins http://download.eclipse.org/mat/1.6/update-site/ org.eclipse.mat.feature.feature.group,org.eclipse.mat.chart.feature.feature.group
echo "Installing latest version of Code Recommenders (Neon release version has bugs)..."
updatePlugins http://download.eclipse.org/recommenders/updates/stable/ org.eclipse.recommenders.rcp.feature.feature.group,org.eclipse.recommenders.mylyn.rcp.feature.feature.group,org.eclipse.recommenders.snipmatch.rcp.feature.feature.group,org.eclipse.recommenders.news.rcp.feature.feature.group
echo "Installing latest version of EGit (Neon release version has bugs)..."
updatePlugins http://download.eclipse.org/egit/updates org.eclipse.jgit.feature.group,org.eclipse.jgit.http.apache.feature.group,org.eclipse.egit.feature.group,org.eclipse.egit.mylyn.feature.group
echo "Installing latest version of Mylyn ..."
updatePlugins http://download.eclipse.org/mylyn/releases/latest org.eclipse.mylyn_feature.feature.group,org.eclipse.mylyn.bugzilla_feature.feature.group,org.eclipse.mylyn.builds.feature.group,org.eclipse.mylyn.commons.feature.group,org.eclipse.mylyn.commons.identity.feature.group,org.eclipse.mylyn.commons.notifications.feature.group,org.eclipse.mylyn.commons.repositories.feature.group,org.eclipse.mylyn.commons.repositories.http.feature.group,org.eclipse.mylyn.context_feature.feature.group,org.eclipse.mylyn.discovery.feature.group,org.eclipse.mylyn.gerrit.feature.feature.group,org.eclipse.mylyn.git.feature.group,org.eclipse.mylyn.hudson.feature.group,org.eclipse.mylyn.java_feature.feature.group,org.eclipse.mylyn.monitor.feature.group,org.eclipse.mylyn.reviews.feature.feature.group,org.eclipse.mylyn.team_feature.feature.group,org.eclipse.mylyn.versions.feature.group,org.eclipse.mylyn.wikitext_feature.feature.group
echo "Installation completed!"
+13 -12
View File
@@ -1,5 +1,7 @@
# Welcome to the SAP Sailing Wiki
<font color="crimson"><b>Info</b> - wiki currently under reconstruction. Some links might still be broken as of yet.</font>
This is the <img src="https://www.sapsailing.com/images/sap-logo_grey.png"/> Wiki where useful information regarding this project can be found.
### The Pitch
@@ -27,7 +29,8 @@ SAP is at the center of today’s technology revolution, developing innovations
* [[Development Environment|wiki/info/landscape/development-environment]]
* [[Production Environment|wiki/info/landscape/production-environment]]
* [[Typical Development Scenarios|wiki/info/landscape/typical-development-scenarios]]
* [[Server|wiki/info/landscape/server]]
* [[RaceLog Tracking Server Architecture|wiki/info/landscape/server]]
* Environment Overview [[PDF|wiki/info/mobile/event-tracking/architecture.pdf]] | [[SVG|wiki/info/mobile/event-tracking/architecture.svg]]
* Amazon
* [[Amazon EC2|wiki/info/landscape/amazon-ec2]]
* [[EC2 Backup Strategy|wiki/info/landscape/amazon-ec2-backup-strategy]]
@@ -42,16 +45,19 @@ SAP is at the center of today’s technology revolution, developing innovations
### Mobile
* [[Mobile Development|wiki/info/mobile/mobile-development]]
* [[App|wiki/info/mobile/app]]
* [[Tracking App Specification|wiki/info/mobile/app-spec/app-spec]]
* [[Android and Release Build|wiki/info/mobile/android-and-release-build]]
* [[Mobile Sailing Analytics|wiki/info/mobile/mobilesailinganalytics]]
* [[Push Notifications|wiki/info/mobile/push-notifications]]
* Tracking App
* [[Tracking App Specification|wiki/info/mobile/app-spec/app-spec]]
* [[Event Tracking|wiki/info/mobile/event-tracking/event-tracking]]
* [[Steps for setting up Smartphone Tracking|wiki/info/mobile/smartphone-tracking-steps]]
* [[Tracking App Prototype Architecture|wiki/info/mobile/app]]
* Racecommittee App
* [[Racecommittee App|wiki/info/mobile/racecommittee-app]]
* [[Environment|wiki/info/mobile/racecommittee-app-environment]]
* [[Administrator|wiki/info/mobile/racecommittee-app-administrator]]
* [[User|wiki/info/mobile/racecommittee-app-user]]
* [[Android and Release Build|wiki/info/mobile/android-and-release-build]]
* [[Mobile Sailing Analytics|wiki/info/mobile/mobilesailinganalytics]]
* [[Push Notifications|wiki/info/mobile/push-notifications]]
### API
@@ -60,9 +66,6 @@ SAP is at the center of today’s technology revolution, developing innovations
* [[Tracking App API|wiki/info/api/tracking-app-api]]
* [[Training API v1 draft|wiki/info/api/training-api-v1-draft]]
### Samples
* [[S3 Sample|wiki/info/samples/s3-sample]]
### Security
* [[Fortify Tests|wiki/info/security/fortify]]
* [[SSL / HTTPS Support|wiki/info/security/ssl-support]]
@@ -73,6 +76,7 @@ SAP is at the center of today’s technology revolution, developing innovations
* [[Data Quality|wiki/info/misc/data-quality]]
* [[Sailing Domain Algorithms|wiki/info/misc/sailing-domain-algorithms]]
* [[Google Analytics (Web Page Tracking)|wiki/info/misc/ganalytics]]
* [[S3 Development Sample|wiki/info/misc/s3-sample]]
* [[FAQ for League Operators|wiki/info/misc/league-operators-faq]]
* [[Prionet related information|wiki/info/misc/prionet-related-information]]
@@ -112,11 +116,8 @@ SAP is at the center of today’s technology revolution, developing innovations
### Miscellaneous
* [[Cook Book|wiki/howto/misc/cook-book]]
* [[Event Tracking|wiki/howto/misc/event-tracking/event-tracking]]
* [[Polars|wiki/howto/misc/polars]]
* [[Server Replication|wiki/howto/misc/server-replication]]
* [[Smartphone Tracking|wiki/howto/misc/smartphone-tracking-general]]
* [[Steps for setting up Smartphone Tracking|wiki/howto/misc/smartphone-tracking-steps]]
* [[TracTrac|wiki/howto/misc/tractrac-lifecycle]]
* [[UI Tests|wiki/howto/misc/ui-tests-tutorial]]
* [[Uploading Media Content|wiki/howto/misc/uploading-media-content]]
@@ -3,8 +3,8 @@
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9998"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<stringAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9874"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9874"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
@@ -42,7 +42,7 @@
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9998 com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9874 com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.dashboards.gwt"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m"/>
</launchConfiguration>
@@ -3,7 +3,7 @@
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT_AUTO" value="true"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT_AUTO" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
@@ -174,25 +174,35 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
SensorFixMapper<Timed, DynamicTrack<Timed>, Competitor> mapper = sensorFixMapperFactory
.createCompetitorMapper(event.getClass());
DynamicTrack<Timed> track = mapper.getTrack(trackedRace, event.getMappedTo());
try {
sensorFixStore.loadFixes((DoubleVectorFix fix) -> mapper.addFix(track, fix), mapping.getDevice(),
timeRangeToLoad.from(), timeRangeToLoad.to(), true);
} catch (NoCorrespondingServiceRegisteredException | TransformationException e) {
logger.log(Level.WARNING, "Could not load track for competitor: " + mapping.getMappedTo()
+ "; device: " + mapping.getDevice());
if (track != null) {
// for split-fleet racing, device mappings coming from the regatta log may not be relevant
// for the trackedRace because the competitors may not compete in it; in this case, the
// competitor retrieved from the mapping event does not have a track in trackedRace
try {
sensorFixStore.loadFixes((DoubleVectorFix fix) -> mapper.addFix(track, fix), mapping.getDevice(),
timeRangeToLoad.from(), timeRangeToLoad.to(), true);
} catch (NoCorrespondingServiceRegisteredException | TransformationException e) {
logger.log(Level.WARNING, "Could not load track for competitor: " + mapping.getMappedTo()
+ "; device: " + mapping.getDevice());
}
}
}
@Override
public void visit(RegattaLogDeviceCompetitorMappingEvent event) {
DynamicGPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(event.getMappedTo());
try {
@SuppressWarnings({ "unchecked" })
DeviceMapping<Competitor> competitorMapping = (DeviceMapping<Competitor>) mapping;
gpsFixStore.loadCompetitorTrack(track, competitorMapping, getStartOfTracking(),
getEndOfTracking());
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load competitor track " + mapping.getMappedTo());
if (track != null) {
// for split-fleet racing, device mappings coming from the regatta log may not be relevant
// for the trackedRace because the competitors may not compete in it; in this case, the
// competitor retrieved from the mapping event does not have a track in trackedRace
try {
@SuppressWarnings({ "unchecked" })
DeviceMapping<Competitor> competitorMapping = (DeviceMapping<Competitor>) mapping;
gpsFixStore.loadCompetitorTrack(track, competitorMapping, getStartOfTracking(),
getEndOfTracking());
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load competitor track " + mapping.getMappedTo());
}
}
}
@@ -3,6 +3,7 @@
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9876"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9876"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart"/>
@@ -3,6 +3,7 @@
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT_AUTO" value="true"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT_AUTO" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
@@ -56,11 +56,7 @@ public class RegattaOverviewTabView extends Composite implements RegattaTabView<
@Override
public TabView.State getState() {
if (currentPresenter.getEventDTO().getType() == EventType.MULTI_REGATTA) {
return State.VISIBLE;
} else {
return State.VISIBLE;
}
return State.VISIBLE;
}
@Override
@@ -39,12 +39,12 @@
padding: 1.333333333333333em 0.333333333333333em 0.333333333333333em 0.333333333333333em;
vertical-align: top;
}
.regattacompetition_phase_fleet:first-child {
padding-left: 0.666666666666667em;
}
.regattacompetition_phase_fleet:last-child {
padding-right: 0.666666666666667em;
}
/* .regattacompetition_phase_fleet:first-child { */
/* padding-left: 0.666666666666667em; */
/* } */
/* .regattacompetition_phase_fleet:last-child { */
/* padding-right: 0.666666666666667em; */
/* } */
.regattacompetition_phase_fleetfullwidth .regattacompetition_phase_fleet_race {
height: 3.466666666666666666em;
text-align: center;
@@ -74,8 +74,14 @@
font-size: 1.066666666666667em;
font-weight: 700;
min-height: 2.8125em;
padding-left: 0.9375em;
margin-bottom: 0.9375em;
margin-bottom: 0.375em;
text-align: center;
}
.regattacompetition_phase_fleetcompact .regattacompetition_phase_fleet_title {
font-size: 0.966666666666667em;
}
.regattacompetition_phase_fleetcompact .regattacompetition_phase_fleet_race_title:after {
width: 1.066666666666667em;
}
.regattacompetition_phase_fleet_race {
position: relative;
@@ -41,6 +41,7 @@ public class RegattaCompetitionFleet extends AbstractRegattaCompetitionFleet {
public void setNumberOfFleetsInSeries(int fleetCount) {
getElement().getStyle().setWidth(100.0 / fleetCount, Unit.PCT);
setStyleName(local_res.css().regattacompetition_phase_fleetfullwidth(), fleetCount < 2);
setStyleName(local_res.css().regattacompetition_phase_fleetcompact(), fleetCount > 4);
}
@Override
@@ -7,7 +7,6 @@ import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.sap.sailing.gwt.home.communication.race.SimpleRaceMetadataDTO;
import com.sap.sailing.gwt.home.communication.race.SimpleRaceMetadataDTO.RaceTrackingState;
import com.sap.sailing.gwt.home.shared.partials.regattacompetition.AbstractRegattaCompetitionFleetRace;
import com.sap.sailing.gwt.home.shared.partials.regattacompetition.RegattaCompetitionPresenter;
@@ -67,9 +66,4 @@ public class RegattaCompetitionFleetRace extends AbstractRegattaCompetitionFleet
return local_res.css().regattacompetition_phase_fleet_raceuntracked();
}
@Override
protected boolean isUntrackedRace(RaceTrackingState trackingState) {
return super.isUntrackedRace(trackingState);
}
}
@@ -22,6 +22,7 @@ public interface RegattaCompetitionResources extends ClientBundle {
String regattacompetition_phase_fleet();
String regattacompetition_phase_fleetfullwidth();
String regattacompetition_phase_fleet_race_title();
String regattacompetition_phase_fleetcompact();
String regattacompetition_phase_fleet_race_subtitle();
String regattacompetition_phase_fleet_race_arrow();
String regattacompetition_phase_fleet_title();
@@ -72,8 +72,7 @@ public abstract class AbstractRegattaCompetitionFleetRace extends Widget impleme
}
private void setupRaceState(RaceTrackingState trackingState, RaceViewState viewState) {
// boolean isUntrackedRace = trackingState != RaceTrackingState.TRACKED_VALID_DATA;
boolean isUntrackedRace = isUntrackedRace(trackingState);
boolean isUntrackedRace = trackingState != RaceTrackingState.TRACKED_VALID_DATA;
if (viewState == RaceViewState.RUNNING) {
mainElement.addClassName(getRaceLiveStyleName());
getRaceStateUiElement().setInnerText(isUntrackedRace ? I18N.live() : I18N.actionWatch());
@@ -109,9 +108,4 @@ public abstract class AbstractRegattaCompetitionFleetRace extends Widget impleme
protected abstract String getRaceUntrackedStyleName();
// TODO: As long as there is no mobile race viewer, show all races as untracked
// This is a temporary method to be able to fulfill this requirement
protected boolean isUntrackedRace(RaceTrackingState trackingState) {
return trackingState != RaceTrackingState.TRACKED_VALID_DATA;
}
}
@@ -9,6 +9,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -358,6 +359,11 @@ public class Util {
return defaultVal;
}
/**
* Ensures that a {@link Set Set&lt;V&gt;} is contained in {@code map} for {@code key} and
* then adds {@code value} to that set. No synchronization / concurrency control effort is
* made. This is the caller's obligation.
*/
public static <K, V> void addToValueSet(Map<K, Set<V>> map, K key, V value) {
Set<V> set = map.get(key);
if (set == null) {
@@ -366,17 +372,32 @@ public class Util {
}
set.add(value);
}
/**
* Removes {@code value} from all sets contained as values in {@code map}. If a set is emptied by this removal it is
* removed from the map. No synchronization / concurrency control effort is made. This is the caller's obligation.
*/
public static <K, V> void removeFromAllValueSets(Map<K, Set<V>> map, V value) {
for (Set<V> set : map.values()) {
set.remove(value);
for (final Iterator<Entry<K, Set<V>>> i=map.entrySet().iterator(); i.hasNext(); ) {
final Entry<K, Set<V>> e = i.next();
e.getValue().remove(value);
if (e.getValue().isEmpty()) {
i.remove();
}
}
}
/**
* Removes {@code value} from the set that is the value for {@code key} in {@code map} if that key exists. If the
* set existed and is emptied by this removal it is removed from the map. No synchronization / concurrency control
* effort is made. This is the caller's obligation.
*/
public static <K, V> void removeFromValueSet(Map<K, Set<V>> map, K key, V value) {
final Set<V> valuesPerKey = map.get(key);
if(valuesPerKey != null) {
valuesPerKey.remove(value);
if (valuesPerKey != null) {
if (valuesPerKey.remove(value) && valuesPerKey.isEmpty()) {
map.remove(key);
}
}
}
@@ -3,6 +3,7 @@
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9875"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9875"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sse.security.ui.Register"/>
@@ -3,8 +3,8 @@
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9995"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9995"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT_AUTO" value="true"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT_AUTO" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sse.security.ui.Register"/>
<listEntry value="com.sap.sse.security.ui.UserManagement"/>
@@ -48,7 +48,7 @@
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosuperDevMode -incremental -workDir &quot;${project_loc:com.sap.sse.security.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sse.security.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9995 -startupUrl /security/ui/Login.html com.sap.sse.security.ui.Login -startupUrl /security/ui/EditProfile.html com.sap.sse.security.ui.EditProfile -startupUrl /security/ui/EmailValidation.html com.sap.sse.security.ui.EmailValidation -startupUrl /security/ui/UserManagement.html com.sap.sse.security.ui.UserManagement -startupUrl /security/ui/Register.html com.sap.sse.security.ui.Register -startupUrl /security/ui/Login.html com.sap.sse.security.ui.Login com.sap.sse.security.ui.Login com.sap.sse.security.ui.EditProfile com.sap.sse.security.ui.EmailValidation com.sap.sse.security.ui.OAuthLogin com.sap.sse.security.ui.UserManagement com.sap.sse.security.ui.Register"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosuperDevMode -incremental -workDir &quot;${project_loc:com.sap.sse.security.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sse.security.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort auto -startupUrl /security/ui/Login.html com.sap.sse.security.ui.Login -startupUrl /security/ui/EditProfile.html com.sap.sse.security.ui.EditProfile -startupUrl /security/ui/EmailValidation.html com.sap.sse.security.ui.EmailValidation -startupUrl /security/ui/UserManagement.html com.sap.sse.security.ui.UserManagement -startupUrl /security/ui/Register.html com.sap.sse.security.ui.Register -startupUrl /security/ui/Login.html com.sap.sse.security.ui.Login com.sap.sse.security.ui.Login com.sap.sse.security.ui.EditProfile com.sap.sse.security.ui.EmailValidation com.sap.sse.security.ui.OAuthLogin com.sap.sse.security.ui.UserManagement com.sap.sse.security.ui.Register"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sse.security.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms1024m -Xmx3072m"/>
</launchConfiguration>
@@ -190,12 +190,6 @@ public class TrackingActivity extends BaseActivity implements GPSQualityListener
bindService(trackingServiceIntent, trackingServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
ServiceHelper.getInstance().stopTrackingService(this);
super.onDestroy();
}
@Override
public void onStop() {
super.onStop();
+4 -3
View File
@@ -166,7 +166,7 @@ To not be dependent on a shaky power source that can be restored by "wiggling pi
### DNS Server Setup
The DNS Server acts as a gateway/router, caching proxy and nameserver.
#### Gateway
### Gateway
All traffic to and from the internet is going through this server. To achieve that goal it routes all internal connections by default to an interface called `em2`. This interface is in most cases connected to an external router and must be configured according to the specifications sent over by the ISP. The routing is achieved by first having the right configuration for the interface (example from Cardiff ISP):
<pre>
@@ -291,7 +291,7 @@ ip route flush table main
sh /root/restart_firewall.sh
</pre>
#### Nameserver
### Nameserver
The nameserver makes sure to redirect some urls to the local server. In the current configuration it will redirect all ess40-2014.sapsailing.com requests to local servers unless disabled. The basic configuration can be found in `/etc/named.conf`
<pre>
@@ -429,7 +429,7 @@ www.sapsailing.com. A 192.168.1.201
The tool to show configuration and manage entries at runtime is called `rndc`. If you want to see stats then you have to dump them using `rndc stats`. They will then get dumped to `/var/named/data/named_stats.txt`.
#### Caching Proxy
### Caching Proxy
The transparent caching proxy (Squid) intercepts all connections on port 80 (configured by the firewall script that forwards all connections on port 80 to port 3128 where the proxy runs) and caches some information bits like images or stylesheets. This helps reducing the bandwith. The configuration can be found at `/etc/squid/squid.conf`. The configuration is optimized for high traffic - make sure you understand what you're doing before changing anything.
<pre>
@@ -564,6 +564,7 @@ To terminate the tunnel connections, run the following command from the `sailing
</pre>
This kill script is generated during the execution of the script establishing the tunnels and records the PIDs of the autossh processes to kill.
### Replicate Race Logs
<pre>
+6 -6
View File
@@ -8,7 +8,7 @@ Dispatch is a communication pattern based on the command pattern.
The picture below overviews the tradional dispatch approach:
![Traditional Dispatch](images/dispatch/traditional_dispatch.png)
![Traditional Dispatch](/wiki/images/dispatch/traditional_dispatch.png)
The main working parts of a traditional dispatch system are:
@@ -63,7 +63,7 @@ The GwtIncompatible annotation is required and makes it possible to place backen
By putting the code that will be executed on the server side directly in the action class, we need to provide access to the server side services.
The execution is triggered directly by the receiving dispatch servlet, eliminating the need for an ActionHandler.
![SSE Dispatch](images/dispatch/sse_dispatch.png)
![SSE Dispatch](/wiki/images/dispatch/sse_dispatch.png)
## Server side setup
@@ -256,7 +256,7 @@ The Action interface explicetely declares that the server side execution may thr
Custom exceptions that should be delivered to the client should always extend the DispatchException.
![SSE Exception](images/dispatch/sse_exceptions.png)
![SSE Exception](/wiki/images/dispatch/sse_exceptions.png)
The DispatchException creates an unique UUID String that is logged on the server side and sent to the client.
This way it is possible to find the server exception catched in the client code in the server logs (if logging on both ends is properly configured).
@@ -272,7 +272,7 @@ to add cross cutting concern functionality to the core dispatch system.
There are currently two decorators provided by the com.sap.sse.gwt module: CachingDispatch and AutomaticBatchingDispatch.
![SSE Dispatch Decorators](images/dispatch/sse_dispatch_decorators.png)
![SSE Dispatch Decorators](/wiki/images/dispatch/sse_dispatch_decorators.png)
### CachingDispatch
@@ -293,7 +293,7 @@ for the back and forth navigation from local cache improves navigation speed.
The AutomaticBatchingDispatch decorator provides transparent batching: actions fired in the same event loop are
queued up and sent as one batch action to the server, where the actions are sequentially "unpacked" and "executed".
![SSE Batching](images/dispatch/sse_batching.png)
![SSE Batching](/wiki/images/dispatch/sse_batching.png)
This means that the order in which the action get fired is the order in which they get enqueued/ executed.
@@ -303,5 +303,5 @@ low – both improvements regarding user latency experience.
By ensuring order of execution, the application must not wait until one request/ action finishes before starting
the next, eliminating the need for extra roundtrips otherwise required due to the asynchronous nature of AJAX calls.
![AJAX Async](images/dispatch/ajax-async.png)
![AJAX Async](/wiki/images/dispatch/ajax-async.png)
@@ -32,7 +32,7 @@ Todo: clarify what to look for in the logs
# WindBot User Guide (v. 1.0 R3)
[User Guide v. 1.0 R3](wiki/uploads/WindBot%20User%20Guide%201.0%20R3.pdf)
[User Guide v. 1.0 R3](/wiki/uploads/WindBot%20User%20Guide%201.0%20R3.pdf)
# Is the WindBot waterproof and does it sink if dropped it in the water?
+3 -3
View File
@@ -60,7 +60,7 @@ The PolarDataService is an OSGi service. Above all it is retrieved by the Racing
## Polar Datamining Architecture
For general information about the Datamining Architecture please see [this wikipage](/wiki/data-mining-architecture).
For general information about the Datamining Architecture please see [this wikipage](/wiki/info/landscape/data-mining-architecture).
This section will focus on the polar specific datamining functionality.
@@ -70,7 +70,7 @@ Most of the classes are for custom polar datamining. In this section we will con
### File Locations / Project Structure
The project structure sticks to the best practices described [here](/wiki/typical-data-mining-scenarios). There are two bundles:
The project structure sticks to the best practices described [here](/wiki/info/landscape/typical-data-mining-scenarios). There are two bundles:
com.sap.sailing.polars.datamining and com.sap.sailing.polars.datamining.shared; the latter containing classes that are serializable by the GWT engine.
An Activator registeres the polar datamining functionality with the main datamining server. The data package contains the retrieval data classes, the component package contains retrieval processors and the aggregators package contains the two aggregators.
@@ -82,7 +82,7 @@ The UI classes live in the gwt.ui bundle; more precisely in the com.sap.sailing.
The feature can be extended by adding dimensions to the types in the polar.datamining bundle.
This dimensions then serve as a new option in filtering and grouping.
How that works is displayed [here](/wiki/typical-data-mining-scenarios).
How that works is displayed [here](/wiki/info/landscape/typical-data-mining-scenarios).
### Known Issues
+2 -2
View File
@@ -29,7 +29,7 @@ The necessary Eclipse plugins described above can be automatically be installed
Be aware that with this script it's not possible to update the plugins to newer versions. Instead you can install a new version by unpacking the base package and executing the script.
On Windows you need a Git Bash or Cygwin shell to run the script.
On Windows you need a Git Bash or Cygwin shell to run the script. In addition you need to replace all backslashes with forward slashes.
On Mac OS, it's not sufficient to provide the path to the app, instead you need to get the path to the directory inside of the app package hosting the "eclipse" binary (.../Eclipse.app/Contents/MacOS).
@@ -184,4 +184,4 @@ If git is not in the Path system environment variable, the gradle build will not
2. choose git in the drop down
3. if everything is correct, you'll see the current branch at the bottom line
See [RaceCommittee App](racecommittee-app) for more information regarding the mobile app.
See [RaceCommittee App](/wiki/info/mobile/racecommittee-app) for more information regarding the mobile app.
@@ -81,4 +81,4 @@ If one of these problems occur then you have to safely remove the race and re-ad
### Screenshot(s)
[Screenshot of Kieler Woche Proxy 2012 Races selection](wiki/images/RacesKielerWocheProxy2012.jpg)
[Screenshot of Kieler Woche Proxy 2012 Races selection](/wiki/images/RacesKielerWocheProxy2012.jpg)
@@ -96,7 +96,7 @@ Copied the httpd configuration files `/etc/httpd/conf/httpd.conf`, `/etc/httpd/c
CustomLog logs/access_log first_forwarded_for_ip env=original_client_ip
</pre>
They ensure that the original client IPs are logged also if the Apache server runs behind a reverse proxy or an ELB. See also [the section on log file analysis](/wiki/log-file-analysis#log-file-analysis_log-file-types_apache-log-files).
They ensure that the original client IPs are logged also if the Apache server runs behind a reverse proxy or an ELB. See also [the section on log file analysis](/wiki/howto/development/log-file-analysis#log-file-analysis_log-file-types_apache-log-files).
Copied /etc/logrotate.conf from an existing SL instance so that `/var/log/logrotate-target` is used to rotate logs to.
@@ -21,7 +21,7 @@ To register/deregister a data mining bundle, you just have to register/deregiste
### String Messages
A data mining bundle needs string messages, that are created server-side (for example to internationalize the display name of a function). To create string messages for the bundle do the steps described in [Typical Data Mining Scenarios](/wiki/typical-data-mining-scenarios#Adding-a-new-Data-Mining-Bundle).
A data mining bundle needs string messages, that are created server-side (for example to internationalize the display name of a function). To create string messages for the bundle do the steps described in [Typical Data Mining Scenarios](/wiki/info/landscape/typical-data-mining-scenarios#Adding-a-new-Data-Mining-Bundle).
The provided `ResourceBundleStringMessages` will be added to the string messages of the framework, when the data mining bundle is registered. The framework string messages are an instance of `CompoundResourceBundleStringMessages`, that logs message keys that occur multiple times with the log level `INFO`.
@@ -76,7 +76,7 @@ performanceReportCase.addMeasurement(new Measurement("MeasurementName", measurem
## Product, Features and Target Platform
The result of the build process is a p2 repository with a product consisting of a number of features. The product configuration is provided by the file raceanalysis.product in the com.sap.sailing.feature.p2build project. In its dependencies it defines the features of which it is built, which currently are com.sap.sailing.feature and com.sap.sailing.feature.runtime, each described in an equal-named bundle. The feature specified by com.sap.sailing.feature lists the bundles we develop ourselves as part of the project. The com.sap.sailing.feature.runtime feature lists those 3rd-party bundles from the target platform which are required by the product.
The [target platform](#Target-Platform) is defined in the various flavors for local and central environments in com.sap.sailing.targetplatform/definitions/*.target. It mainly uses Eclipse p2 repositories and our own p2 repository at http://p2.sapsailing.com/p2/sailing/ where we store those bundles required by our runtime which cannot be found as OSGi bundles in any other public p2 repository of which we are aware.
The [target platform](#development-environment_target-platform) is defined in the various flavors for local and central environments in com.sap.sailing.targetplatform/definitions/*.target. It mainly uses Eclipse p2 repositories and our own p2 repository at http://p2.sapsailing.com/p2/sailing/ where we store those bundles required by our runtime which cannot be found as OSGi bundles in any other public p2 repository of which we are aware.
This p2 repository at sapsailing.com can be re-built and correspondingly extended by the process explained [here](wiki/typical-development-scenarios#Adding-a-Bundle-to-the-Target-Platform).
+3 -4
View File
@@ -8,9 +8,8 @@ RaceLog tracking has been merged into the master branch with commit 4b4b61b6c518
* ``ftes-rltracking-equestrian``: Serves as a reference implementation of a tracking adapter built for RaceLog-tracking.
# Architectural Overview
The basic architecture of Racelog-tracking is presented in this diagram (download as [[PDF|/wiki/howto/misc/event-tracking/architecture.pdf]]):
[[/wiki/howto/misc/event-tracking/architecture.svg]]
**The basic architecture of Racelog-tracking is presented in this diagram:
download as [PDF](/wiki/info/mobile/event-tracking/architecture.pdf) or [SVG](/wiki/howto/misc/event-tracking/architecture.svg)**
Following the numbers in the diagram, this is a possible race log tracking scenario:
@@ -34,7 +33,7 @@ When thinking about smartphone tracking, it would of course be a good idea to al
## Steps for setting up a racelog-tracked race in the AdminConsole
[[Walkthrough with screenshots|wiki/howto/misc/event-tracking/event-tracking]]
[[Walkthrough with screenshots|wiki/info/mobile/event-tracking/event-tracking]]
## Reloading a race that has already been tracked
@@ -6,13 +6,13 @@
The following points describe the steps to create a new data mining bundle. An example for a data mining bundle is `com.sap.sailing.datamining`.
* Add a new java project bundle according to the [Typical Development Scenarios](/wiki/typical-development-scenarios#Adding-a-Java-Project-Bundle)
* Add a new java project bundle according to the [Typical Development Scenarios](/wiki/info/landscape/typical-development-scenarios#Adding-a-Java-Project-Bundle)
* Add the necessary dependencies to the `MANIFEST.MF`
* `com.sap.sse` (for the string messages)
* `com.sap.sse.datamining`
* `com.sap.sse.datamining.shared`
* `com.sap.sse.datamining.annotations`
* Create an `Activator` for the new data mining bundle and provide a `DataMiningBundleService` to the OSGi-Context (see [Registration and Deregistration of Data Mining Bundles](data-mining-architecture#Registration-and-Deregistration-of-Data-Mining-Bundles) for detailed information)
* Create an `Activator` for the new data mining bundle and provide a `DataMiningBundleService` to the OSGi-Context (see [Registration and Deregistration of Data Mining Bundles](/wiki/info/landscape/data-mining-architecture#Registration-and-Deregistration-of-Data-Mining-Bundles) for detailed information)
* This can be done by extending the `AbstractDataMiningActivator` and implementing it's abstract methods. (Recommended)
* Or by implementing your own `DataMiningBundleService` and register it as OSGi-Service
* Prepare the string messages
@@ -66,7 +66,7 @@ The main task to integrate the data mining bundle is to define the Fact (with it
The following sections describe how to implement the different components.
Note that the process described above is a very specific process to calculate aggregations from a collection of Facts (in the code referred as Statistic Query) and that the data mining framework is capable to execute many other processes. For general and more detailed information about the framework and its architecture see [Data Mining Architecture](data-mining-architecture).
Note that the process described above is a very specific process to calculate aggregations from a collection of Facts (in the code referred as Statistic Query) and that the data mining framework is capable to execute many other processes. For general and more detailed information about the framework and its architecture see [Data Mining Architecture](/wiki/info/landscape/data-mining-architecture).
### Implement the Fact and the Data Retrieval
@@ -86,7 +86,7 @@ The data retrieval process can be separated in multiple levels. Each level is pe
* The standard criterion that is used, checks if the dimensional value of the given element (provided via a Dimension) matches a specific value.
* For example if you want to analyze races of a specific regatta, but a retriever would provide races of many regattas the Filter can be used to exclude the unwanted races.
* Filter Criteria can also be defined in a more general way. See the [Data Mining Architecture](/wiki/data-mining-architecture#Filter-Criteria) for detailed information.
* Filter Criteria can also be defined in a more general way. See the [Data Mining Architecture](/wiki/info/landscape/data-mining-architecture#Filter-Criteria) for detailed information.
Splitting the data retrieval into multiple levels provides several benefits for the whole data mining process:
@@ -126,7 +126,7 @@ Note that the Fact and Intermediate Types are separated in an Interface and a Cl
* Create the Interfaces in the data mining bundle you want to edit.
* The current naming convention for such Interfaces is `Has<Name>Context`. If the Fact/Intermediate Type is close to the domain element, could the name be equal to the name of the domain element. For example the name of the Fact that represents `TrackedLegOfCompetitor` would be `HasTrackedLegOfCompetitorContext`.
* Add the methods that provide the contextual information
* Such methods are called Dimensions and have to be marked with the [Annotation `@Dimension`](/wiki/data-mining-architecture#Dimensions).
* Such methods are called Dimensions and have to be marked with the [Annotation `@Dimension`](/wiki/info/landscape/data-mining-architecture#Dimensions).
* These methods should return values that
* are a primitive type or wrapper class
* or classes that implement `equals()`, `hashCode()` and `toString()`. Otherwhise the grouping could fail and the result presentation will be unreadable.
@@ -145,12 +145,12 @@ Note that the Fact and Intermediate Types are separated in an Interface and a Cl
* `getRegatta()` returns a `Regatta` that implements `Named` that has the method `getName()`, which is annotated as Dimension.
* `getCompetitor` returns a `Competitor` that implements `Named` and contains multiple annotated methods. For example `getBoat()` that has the method `getSailID()`, which is annotated as Dimension. This results in multiple Dimensions (e.g. the competitor name and sail ID) starting with the method `getCompetitor()`.
* An inderict Dimension can be seen as a concatenation of method calls. For example `getCompetitor().getBoat().getSailID()`, where `getCompetitor()` and `getBoat()` are annotated with `@Connector` and `getSailID()` is annotated with `@Dimension`.
* Short information about `@Dimension` and `@Connector`. For detailed information see their Javadoc or [Data Mining Annotations](/wiki/data-mining-architecture#Connectors).
* Short information about `@Dimension` and `@Connector`. For detailed information see their Javadoc or [Data Mining Annotations](/wiki/info/landscape/data-mining-architecture#Connectors).
* **@Dimension**
* Has the mandatory member `messageKey` that is used for internationalization, which has to be added to the `stringMessages*.properties` of the data mining bundle.
* And an optional member `ordinal` that is used for the natural order of Dimensions.
* **@Connector**
* Has the optional members `messageKey` and `ordinal`, that work like the corresponding members of `@Dimension`. See [Compound Functions](/wiki/data-mining-architecture#Compound-Functions) for information about how these members are used in indirect Dimensions.
* Has the optional members `messageKey` and `ordinal`, that work like the corresponding members of `@Dimension`. See [Compound Functions](/wiki/info/landscape/data-mining-architecture#Compound-Functions) for information about how these members are used in indirect Dimensions.
* Methods marked with data mining annotations mustn't have parameters except
* the first method of an indirect Dimension
* direct Dimensions
@@ -211,7 +211,7 @@ The following points should be considered during the Retriever implementation:
* `(ExecutorService, Collection<Processor<OutputType, ?>>, int)`
* `(ExecutorService, Collection<Processor<OutputType, ?>>, <? extends SerializableSettings>, int)`
* Otherwhise the framework will throw an `IllegalArgumentException` when an instance of the Retriever is constructed.
* For general information about Processors see [Data Mining Architecture](/wiki/data-mining-architecture#Processors).
* For general information about Processors see [Data Mining Architecture](/wiki/info/landscape/data-mining-architecture#Processors).
The next step is put the Retrievers together in a `DataRetrieverChainDefinition`. Such a definition is used by the framework to create the Data Retrieval part of the [Data Mining Process](#Implementing-the-Data-Mining-Components). It tells the framework which components are used to retrieve the data and in which order. The following points have to be considered to create a new `DataRetrieverChainDefinition`:
@@ -226,7 +226,7 @@ The next step is put the Retrievers together in a `DataRetrieverChainDefinition`
* Note that every Retriever needs a constructor that has a parameter list like the ones described above or an `IllegalArgumentException` will be thrown.
* **Don't forget** to to register the new `DataRetrieverChainDefinition` to the data mining framework. This is done by adding the new one to the ones returned by `getDataRetrieverChainDefinitions()` of the `DataMiningBundleService` of the data mining bundle.
* An example for a `DataRetrieverChainDefinition` creation can be found in `SailingDataRetrievalChainDefinitions` in the package `com.sap.sailing.datamining`.
* For detailed information about `DataRetrieverChainDefinition` see its Javadoc or [Data Mining Architecture](/wiki/data-mining-architecture#Defining-and-building-a-Data-Retriever-Chain).
* For detailed information about `DataRetrieverChainDefinition` see its Javadoc or [Data Mining Architecture](/wiki/info/landscape/data-mining-architecture#Defining-and-building-a-Data-Retriever-Chain).
The last step is to implement a `DataSourceProvider`. In most cases you'll be able to reuse existing `DataSourceProviders` (for example the `RacingEventServiceProvider` located in `com.sap.sailing.datamining`), but if you have to implement a new one this is how it's done:
@@ -279,7 +279,7 @@ trackedLegRetrieverChain.endWith(TrackedLegOfCompetitorRetrievalProcessor.class)
### Implement domain specific Aggregators
It may be necessary, that your data mining bundle needs domain specific [Aggregators](/wiki/data-mining-architecture#Aggregators). For example to compute the aggregations for domain specific Key Figures (like `Distance`), that can't be done by the domain independent Aggregators (for example the Aggregators for numerical values located in `com.sap.sse.datamining.impl.components.aggregators`). Examples for domain specific aggregators can be found in the package `com.sap.sailing.datamining.impl.components.aggregators`.
It may be necessary, that your data mining bundle needs domain specific [Aggregators](/wiki/info/landscape/data-mining-architecture#Aggregators). For example to compute the aggregations for domain specific Key Figures (like `Distance`), that can't be done by the domain independent Aggregators (for example the Aggregators for numerical values located in `com.sap.sse.datamining.impl.components.aggregators`). Examples for domain specific aggregators can be found in the package `com.sap.sailing.datamining.impl.components.aggregators`.
There are several base classes for Aggregators that should be used for different purposes:
@@ -296,7 +296,7 @@ There are several base classes for Aggregators that should be used for different
* If the aggregation is of the kind, that a single value is picked from the collection of input elements use `AbstractParallelSingleGroupedValueAggregationProcessor`. For example to calculate the minimum or maximum.
* This base class is special, because it has only the generic type attribute `ValueType`. This means that the `ExtractedType` is equal to the `AggregatedType`.
* The abstract method `ValueType compareValuesAndReturnNewResult(ValueType currentResult, ValueType newValue)` has to compare the current result with the new value and return the new result.
* For detailed information about Aggregators see [Data Mining Architecture](/wiki/data-mining-architecture#Aggregators).
* For detailed information about Aggregators see [Data Mining Architecture](/wiki/info/landscape/data-mining-architecture#Aggregators).
The next step is to define a `AggregationProcessorDefinition` for the new Aggregator.
+1 -1
View File
@@ -14,7 +14,7 @@ The following bundles implement the Shiro-based security features for SSE:
This bundle contains the core Shiro libraries which so far are not yet part of the target platform. It provides basic services such as the `SecurityService` and utilities such as `SessionUtils` and `ClientUtils`. The `SecurityService` instance is created by the bundle activator and registered with the OSGi service registry.
`UsernamePasswordRealm` and `OAuthRealm` are two realm implementations provided by the bundle that can be used in `shiro.ini` configuration files. Both realms store and obtain user-specific data including the roles and permissions in a `UserStore` (see the [com.sap.sse.security.userstore.mongodb](/wiki/usermanagement#com.sap.sse.security.userstore.mongodb) section) which is an instance shared by the realm objects as well as the `SecurityService`.
`UsernamePasswordRealm` and `OAuthRealm` are two realm implementations provided by the bundle that can be used in `shiro.ini` configuration files. Both realms store and obtain user-specific data including the roles and permissions in a `UserStore` (see the [com.sap.sse.security.userstore.mongodb](/wiki/info/landscape/usermanagement#user-management-and-security_shiro-integration-into-sse_bundle-structure_com-sap-sse-security-userstore-mongodb) section) which is an instance shared by the realm objects as well as the `SecurityService`.
A web bundle that wants to use Shiro-based security and user management features should declare the following in its `WEB-INF/web.xml` descriptor:
@@ -7,7 +7,7 @@ The provider for our servers is PIRONET. They are responsible in any case of eme
- sapcoe-app01 (main server running all services)
- sapcoe-template01 (backup server for data and servers)
You can find additional information here: [Welcome Guide](wiki/uploads/WGuidePironet.pdf)
You can find additional information here: [Welcome Guide](/wiki/uploads/WGuidePironet.pdf)
### 24x7 Bereitschaft (Emergency)
File renamed without changes.
@@ -1,5 +1,7 @@
# Tracking a Race using the RaceLog
### Event Setup
[[walkthrough/01_regatta.png]]
***
@@ -24,6 +26,9 @@
***
### Device Tracking Setup
If you want to import a .kml file or another tracking record, continue with the following steps. If you intend to link a physical device and use it for tracking, continue on the page [Smartphone Tracking Steps](/wiki/info/mobile/smartphone-tracking-steps).
[[walkthrough/07_mappings.png]]
***
+1 -1
View File
@@ -1,6 +1,6 @@
# Mobile Development
See [On Boarding](onboarding#Additional-steps-required-for-Android-projects) how to set up your build environment for mobile development.
See [Onboarding](/wiki/howto/onboarding#Additional-steps-required-for-Android-projects) how to set up your build environment for mobile development.
## Emulation
@@ -1,6 +1,6 @@
#Smartphone Tracking
With the development of [RaceLogTracking](racelog-tracking) and the [Tracking App](tracking-app) it is now possible to track races using only smartphones. This can be set up following the following steps.
It is now possible to track races using only smartphones. This can be set up following the following steps.
1. Create Event, Regatta, Leaderboard,... as always. Make sure to make a LeaderboardGroup and attach it to the event.
@@ -1,9 +1,11 @@
# Steps to setup Smartphone TRacking
## prerequisitites
First of all, you need either an online server landscape which is accessible from outside, or a local one with a working setup allowing your smartphone or tablet to establish a connection to.
## event setup
Log on to the Administration Console and make sure you have a working Event setup.
For further information on how to achieve this, have a look at [this walkthrough](./wiki/racelog-tracking/walkthrough).
For further information on how to achieve this, have a look at [this walkthrough](/wiki/info/mobile/event-tracking/event-tracking).
After completing these steps up until the point "Add Device Mappings" or by simply following the step-by-step wizard, you should have the following setup:
* an Event
@@ -18,14 +20,14 @@ Usually this step is carried out by the wizard automatically.
* races denoted for racelog tracking
* defined course layouts for these races
## pinning buoys and other race marks
## pinging buoys and other race marks
To map positions of all of the required marks, you need to invite one or multiple people as Buoy Tenders. Do so by navigating to "Connectors->Smartphone Tracking" in the Admin Console, selecting your Regatta from the list, and then clicking the Mail Icon under "Actions" within the entry.
Those invited people then need to download the [SAP Sailing Buoy Pinger](https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app) App - a link is also provided in the mail they received. Once installed, they will see all marks related to this regatta listed within the app, enabling them to ping their exact positions via GPS.
You can later on adjust these positions within the app, or manually in the Admin Console once Tracking has started.
## start tracking using an Android phone or tablet
At the same location where you can invite Buoy Pinners, you'll also find the option to map devices to competitors and marks. It is the small smartphone icon next to the mail icon. Once clicked, you will see a screen with potentially earlier created device mappings.
At the same location where you can invite Buoy Pingers, you'll also find the option to map devices to competitors and marks. It is the small smartphone icon next to the mail icon. Once clicked, you will see a screen with potentially earlier created device mappings.
**To add a new device**