Merge branch 'master' into bug4483

This commit is contained in:
Benjamin Barth committed 2018-11-23 13:29:13 +01:00
commit 0169e373eb
27 files changed
+670 -66

No files matched your search

@@ -19,7 +19,6 @@ import com.sap.sse.gwt.dispatch.shared.exceptions.DispatchException;
import com.sap.sse.gwt.dispatch.shared.exceptions.ServerDispatchException;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.User;
import com.sap.sse.security.UserStore;
@GwtIncompatible
public class SailingDispatchContextImpl implements SailingDispatchContext {
@@ -30,20 +29,18 @@ public class SailingDispatchContextImpl implements SailingDispatchContext {
private String clientLocaleName;
private final HttpServletRequest request;
private final SecurityService securityService;
private final UserStore userStore;
private final TrackedRaceStatisticsCache trackedRaceStatisticsCache;
private final WindFinderTrackerFactory windFinderTrackerFactory;
public SailingDispatchContextImpl(Date currentClientTime, RacingEventService racingEventService,
WindFinderTrackerFactory windFinderTrackerFactory, EventNewsService eventNewsService,
SecurityService securityService, UserStore userStore, TrackedRaceStatisticsCache trackedRaceStatisticsCache,
SecurityService securityService, TrackedRaceStatisticsCache trackedRaceStatisticsCache,
String clientLocaleName, HttpServletRequest request) {
this.currentClientTime = currentClientTime;
this.racingEventService = racingEventService;
this.windFinderTrackerFactory = windFinderTrackerFactory;
this.eventNewsService = eventNewsService;
this.securityService = securityService;
this.userStore = userStore;
this.trackedRaceStatisticsCache = trackedRaceStatisticsCache;
this.clientLocaleName = clientLocaleName;
this.request = request;
@@ -96,7 +93,7 @@ public class SailingDispatchContextImpl implements SailingDispatchContext {
public <T> T getPreferenceForCurrentUser(String preferenceKey) {
User currentUser = securityService.getCurrentUser();
if (currentUser != null) {
return userStore.getPreferenceObject(currentUser.getName(), preferenceKey);
return securityService.getPreferenceObject(currentUser.getName(), preferenceKey);
}
return null;
}
@@ -24,7 +24,6 @@ import com.sap.sse.gwt.dispatch.servlets.AbstractDispatchServlet;
import com.sap.sse.gwt.dispatch.shared.commands.Action;
import com.sap.sse.gwt.dispatch.shared.commands.Result;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.UserStore;
import com.sap.sse.util.ServiceTrackerFactory;
public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispatchContext> {
@@ -34,7 +33,6 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
private final ServiceTracker<WindFinderTrackerFactory, WindFinderTrackerFactory> windFinderTrackerFactory;
private final ServiceTracker<EventNewsService, EventNewsService> eventNewsServiceTracker;
private final ServiceTracker<SecurityService, SecurityService> securityServiceTracker;
private final ServiceTracker<UserStore, UserStore> userStoreTracker;
private final ServiceTracker<TrackedRaceStatisticsCache, TrackedRaceStatisticsCache> trackedRaceStatisticsCacheTracker;
public SailingDispatchServlet() {
@@ -43,7 +41,6 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
windFinderTrackerFactory = ServiceTrackerFactory.createAndOpen(context, WindFinderTrackerFactory.class);
eventNewsServiceTracker = ServiceTrackerFactory.createAndOpen(context, EventNewsService.class);
securityServiceTracker = ServiceTrackerFactory.createAndOpen(context, SecurityService.class);
userStoreTracker = ServiceTrackerFactory.createAndOpen(context, UserStore.class);
trackedRaceStatisticsCacheTracker = ServiceTrackerFactory.createAndOpen(context, TrackedRaceStatisticsCache.class);
}
@@ -53,7 +50,7 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
return new SailingDispatchContextImpl(request.getCurrentClientTime(), racingEventServiceTracker.getService(),
windFinderTrackerFactory.getService(),
eventNewsServiceTracker.getService(), securityServiceTracker.getService(),
userStoreTracker.getService(), trackedRaceStatisticsCacheTracker.getService(),
trackedRaceStatisticsCacheTracker.getService(),
request.getClientLocaleName(), getThreadLocalRequest());
}
@@ -2,7 +2,7 @@
left: 50% !important;
top: 50% !important;
position: absolute !important;
background-color: #f2f2f2;
background-color: #ffffff;
padding: 1em;
border: 1px solid #ccc;
border-radius: 3px;
@@ -38,6 +38,7 @@
.buttonPanel {
text-align: center;
font-size: 0;
}
.backgroundPanel {
@@ -64,5 +65,6 @@
.buttonAdjustments {
min-width: 100%;
margin: .5em 0 0;
}
}
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Ajuste de tamaño finalizado correctamente
resizeUnsuccessfull=No es posible el ajuste de tamaño
setUpStorageService=Configure primero un servicio de almacenamiento de ficheros
automaticResizeNeedsStorageService=Ajuste de tamaño automático requiere un FileStorageService que funcione.
qrCodeTitle=Bienvenido {0} a {1}
qrCodeSubtitle={0} - {1}
qrCodeInfoMessage=Escanee este código QR con su smartphone para participar en el evento.
qrCodeErrorMessage=Lo sentimos, esta función no está disponible actualmente.
qrCodeTitleBouy=Bienvenido como buque balizador de {0}
tag=Etiqueta
tagButtons=Botones de etiqueta
tagPanel=Etiquetas
tagCreated=({1}, creado por {0})
tagNoTagsFound=No existen etiquetas
tagAddTag=Añadir etiqueta
tagEditTag=Tratar etiqueta
tagDeleteTag=Borrar etiqueta
tagShareTag=Compartir etiqueta
tagAddTags=Añadir etiquetas
tagSavedSuccessfully=Etiqueta grabada correctamente
tagNotSaved=No se ha podido grabar etiqueta
tagNotSavedReason=No se ha podido grabar etiqueta. Motivo: {0}
tagAlreadyExists=Ya existe etiqueta
tagNotLoaded=No se han podido cargar etiquetas
tagNotLoggedIn=Inicie sesión para añadir etiquetas nuevas
tagNotRemoved=No se ha podido eliminar etiqueta
tagRemovedSuccessfully=Etiqueta eliminada correctamente
tagFilterExplanation=El filtro mostrará todas las etiquetas que coincidan con los siguientes criterios. Los filtros distinguen entre mayúsculas/minúsculas
tagSelectedTags=Etiquetas seleccionadas
tagsFilter=Filtro de etiqueta
tagSearchTags=Buscar
tagLabelTag=Etiqueta
tagLabelComment=Comentario
tagLabelImage=Imagen
tagLabelAction=Acción
tagLabelVisibility=Visibilidad
tagCreateTag=Crear etiqueta
tagEditCustomTagButtons=Tratar botones de selección de etiqueta
tagAddCustomTagButton=Añadir botón de selección
tagNotSpecified=La etiqueta no puede estár en blanco
tagEditFilter=Tratar etiqueta
tagEditCustomTagButton=Tratar botón de etiqueta
tagSaveCustomTagButton=Grabar
tagPreview=Vista previa de etiqueta:
tagVisibleForPublicCheckBox=Visible para público
tagVisibility=Visibilidad
tagConfirmDeletionHeading=Borrar etiqueta
tagConfirmDeletion=Esto borrará la etiqueta "{0}". ¿Desea realmente continuar?
tagButtonConfirmDeletionHeading=Borrar botón de etiqueta
tagButtonConfirmDeletion=Esto borrará el botón de la etiqueta "{0}". ¿Desea realmente continuar?
tagDiscardChangesHeading=Descartar cambios
tagDiscardChanges=¿Está seguro de que desea descartar los cambios?
tagFilterNotSavable=No se han podido grabar las opciones de filtro en el servidor
tagCurrentFilter=Filtro actual:
tagCreateFilterNotLoggedIn=No ha iniciado sesión por tanto no se grabarán los filtros.
tagCreateFilterHint=Crear un conjunto de filtros para filtrar la lista de etiquetas.
tagButtonNotSavable=No se ha podido grabar el botón de la etiqueta en el servidor
tagNotEditable=No puede tratar esta etiqueta
tagPublicModificationPermissionMissing=No dispone de permiso para crear etiquetas públicas, pero sí tiene permiso para crear etiquetas privadas.
tagNotFound=No se ha podido encontrar la etiqueta
tagInvalidURL=Parámetro de URL no válido
tagSharedDialog=Etiqueta compartida
tagSharedURL=Puede compartir esta etiqueta mediante el URL siguiente:
tagCopyToClipBoard=Copiar en el portapapeles
tagBrowseAndUploadImage=Navegar y cargar
tagCopiedLinkSuccessfully=Enlace copiado correctamente en el portapapeles
tagCopiedLinkNotSuccessfully=Su navegador no soporta la copia en el portapapeles; copie el enlace manualmente
username=Nombre de usuario
confirm=Confirmar
cancel=Cancelar
close=Cerrar
boatClasses=Clases de embarcación
sailorProfiles=Perfiles de navegante
unknownSailorProfile=No se ha podido cargar el perfil {0}, ¿ha iniciado sesión como usuario correcto?
profileName=Nombre de perfil
addSailorProfileMessage=Añadir un perfil de navegante nuevo
badges=Identificaciones
newSailorProfileName=Perfil de navegante nuevo
maxSpeedTitle=Velocidad máxima
maxStartLineSpeed=Velocidad máxima al cruzar la línea de salida
shortestDistanceToStartline=Distancia mínima a la línea de salida en el inicio de la carrera
averageDistanceToStartLine=Distancia media a la línea de salida en el inicio de la carrera
metersValue={0,number,#0.0} m
showInRaceboard=Mostrar en Raceboard
showInDataMining=Mostrar en minería de datos
couldNotDetermineStatistic=No se ha podido calcular la estadística
noEventsFoundForCompetitors=No existen eventos disponibles para los competidores seleccionados.
noStatisticsFoundForCompetitors=No existen estadísticas disponibles para los competidores seleccionados.
pleaseSelectCompetitorFirst=Seleccione primero un competidor.
sailorProfileRemoveMessage=¿Está seguro de que desea eliminar este perfil de navegante?
moreLoginInformationSectionSailorProfilesDescription=Después de iniciar sesión, ahora puede buscar una nueva área bajo su perfil de usuario, que se llama Perfiles de navegante. Puede añadir algunos competidores a tal perfil de navegante y obtener más información sobre estos competidores. En un perfil de navegante, puede visualizar todos los eventos en los que sus competidores favoritos han participado y comparar sus posiciones entre sí. Además, obtendrás un resumen de las estadísticas más importantes, como la velocidad máxima o la distancia media a la línea de salida con enlaces directos al mapa de la carrera para visualizar el punto exacto en el tiempo, donde, por ejemplo, el competidor más rápido ha alcanzado su récord. Para estadísticas agregativas como la distancia media a la línea de salida en el inicio de la carrera, puede hacer clic en la flecha y pasará a la minería de datos donde podrá visualizar el promedio de los valores.
moreLoginInformationSectionSailorProfilesHeading=Perfiles de navegante
confirmDeletion=Confirmar borrado
@@ -755,7 +755,7 @@ replay=Relecture
display=Afficher
simulatorPolarHeader=Diagramme polaire
show=Afficher
hide=masquer
hide=Masquer
leftWind=Vent de gauche
rightWind=Vent de droite
strategyOption1=Option de stratégie 1
@@ -813,7 +813,7 @@ raceAbandoned=Abandonné
stopAllReplicas=Supprimer la connexion à tous les réplicas (dangereux !)
warningServerIsReplica=ATTENTION : ce serveur est configuré pour être un réplica. Ne modifiez rien, sinon des erreurs inattendues peuvent se produire.
dropReplicaConnection=Supprimer connexion
timePanelName=Contrôles des temps
timePanelName=Contrôle des temps
competitorFilterExplanation=Ce filtre affichera tous les concurrents qui correspondent aux critères :
protestTime=Heure de réclamation
protestTimeFinishesAt=se termine
@@ -912,7 +912,7 @@ cleanedOverallTime=Durée globale de nettoyage
statisticToCalculate=Calculer statistiques
noQuerySelected=Aucune requête sélectionnée
windImport_Upload=Charger
windImport_Title=Importer vent à partir de Expedition
windImport_Title=Importer vent à partir de l''outil Expedition
windImport_BoatId=N° du bateau :
windImport_SelectedRacesWarning=Voulez-vous réellement importer les données de vent dans les {0} courses ?\nNotez que seules les courses dont l''intervalle est pertinent seront prises en compte.
windImport_AllRacesWarning=Voulez-vous réellement importer les données de vent dans toutes les courses ?\nNotez que seules les courses dont l''intervalle est pertinent seront prises en compte.
@@ -1786,7 +1786,7 @@ couldNotFindRaceInRegatta=Impossible de trouver une course nommée {0} pour une
algorithmTimeOutText=Hors portée
mixedLegText=Vent ambigu
pathCanvasOverlayTitle=Chemin à {0} points. {1} NM dans {2}
windSpeedInKnots=Vitesse du vent en noeuds
windSpeedInKnots=Vitesse du vent en nœuds
activeFilters=Filtre(s) actif(s) : {0}
errorLoadingRegattasForLeaderboardGroup=Erreur lors de la tentative de chargement des régates correspondantes pour le groupe de palmarès {0} : {1}
errorLoadingLeaderBoardGroup=Erreur lors de la tentative de chargement du groupe de palmarès {0} : {1}
@@ -1860,7 +1860,7 @@ moreLoginInformationSectionUserSettingsHeading=Options utilisateur
moreLoginInformationSectionUserSettingsDescription=Certains éléments de l''interface utilisateur peuvent être personnalisés. Les fonctionnalités de base sont accessibles à tous les utilisateurs, mais les utilisateurs authentifiés ont la possibilité de modifier leurs options. Celles-ci sont conservées dans leur profil utilisateur et disponibles sur n''importe quel appareil dès que l''utilisateur se connecte.
moreLoginInformationSectionStrategySimulatorDescription=Le simulateur permet aux navigateurs de simuler des stratégies sur des portions de parcours grâce à des conditions de vent configurables. Le simulateur se base sur l''ensemble des données historiques disponibles dans SAP Sailing Analytics pour fournir des simulations de comportements de catégories de bateaux spécifiques les plus précises possibles.
moreLoginInformationSectionUserNotificationsHeading=Notifications utilisateur
moreLoginInformationSectionUserNotificationsDescription=Grâce aux notifications utilisateur, vous pouvez rester informé sur votre catégorie de bateau, votre équipe ou votre concurrent favoris. Vous avez la possibilité de vous abonner afin de recevoir des notifications par e-mail sur votre catégorie de bateau, votre équipe ou votre concurrent favoris, ainsi que sur les différentes courses à venir.
moreLoginInformationSectionUserNotificationsDescription=Grâce aux notifications utilisateur, vous pouvez rester informé(e) sur votre catégorie de bateau, votre équipe ou votre concurrent préféré(e). Vous avez la possibilité de vous abonner afin de recevoir des notifications par e-mail sur votre catégorie de bateau, votre équipe ou votre concurrent préféré(e), ainsi que sur les différentes courses à venir.
moreLoginInformationRegisterControlText=S''inscrire maintenant
anniversaryUnitText=Courses
anniversaryUnitText[one]=Course
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Redimensionnement correctement terminé
resizeUnsuccessfull=Redimensionnement impossible
setUpStorageService=Veuillez d''abord configurer un service de stockage de fichier.
automaticResizeNeedsStorageService=Pour pouvoir utiliser le redimensionnement automatique, un service de stockage de fichier doit être configuré.
qrCodeTitle=Bienvenue {0} dans {1} !
qrCodeSubtitle={0} - {1}
qrCodeInfoMessage=Veuillez scanner ce code QR avec votre smartphone pour participer à cet événement.
qrCodeErrorMessage=Désolé, cette fonctionnalité n''est pas disponible actuellement.
qrCodeTitleBouy=Bienvenue en tant que navire baliseur pour {0}.
tag=Balise
tagButtons=Boutons de balises
tagPanel=Balises
tagCreated=({1}, création par {0})
tagNoTagsFound=Aucune balise trouvée.
tagAddTag=Ajouter une balise
tagEditTag=Modifier une balise
tagDeleteTag=Supprimer une balise
tagShareTag=Partager une balise
tagAddTags=Ajouter des balises
tagSavedSuccessfully=Balise correctement sauvegardée
tagNotSaved=Impossible de sauvegarder la balise
tagNotSavedReason=Impossible de sauvegarder la balise. Motif : {0}
tagAlreadyExists=La balise existe déjà.
tagNotLoaded=Impossible de charger les balises
tagNotLoggedIn=Connectez-vous pour ajouter de nouvelles balises.
tagNotRemoved=Impossible de supprimer la balise
tagRemovedSuccessfully=Balise correctement supprimée
tagFilterExplanation=Le filtre montre toutes les balises correspondant aux critères suivants. Notez que les filtres sont sensibles à la casse.
tagSelectedTags=Balises sélectionnées
tagsFilter=Filtre de balises
tagSearchTags=Rechercher
tagLabelTag=Balise
tagLabelComment=Commentaire
tagLabelImage=Image
tagLabelAction=Action
tagLabelVisibility=Visibilité
tagCreateTag=Créer balise
tagEditCustomTagButtons=Modifier les boutons de balises
tagAddCustomTagButton=Ajouter bouton de balise
tagNotSpecified=La balise ne doit pas être vide.
tagEditFilter=Modifier filtre
tagEditCustomTagButton=Modifier bouton de balise
tagSaveCustomTagButton=Sauvegarder
tagPreview=Aperçu de balise :
tagVisibleForPublicCheckBox=Visible au public
tagVisibility=Visibilité
tagConfirmDeletionHeading=Supprimer la balise
tagConfirmDeletion=Cette action va supprimer la balise "{0}". Voulez-vous vraiment continuer ?
tagButtonConfirmDeletionHeading=Supprimer le bouton de balise
tagButtonConfirmDeletion=Cette action va supprimer le bouton de balise "{0}". Voulez-vous vraiment continuer ?
tagDiscardChangesHeading=Ignorer les modifications
tagDiscardChanges=Voulez-vous vraiment ignorer les modifications ?
tagFilterNotSavable=Impossible de sauvegarder les options de filtres sur le serveur.
tagCurrentFilter=Filtre actuel :
tagCreateFilterNotLoggedIn=Vous n''êtes pas connecté(e). Les filtres ne seront pas sauvegardés.
tagCreateFilterHint=Créer un ensemble de filtres pour filtrer la liste de balises
tagButtonNotSavable=Impossible de sauvegarder le bouton de balise sur le serveur.
tagNotEditable=Vous ne devez pas modifier cette balise.
tagPublicModificationPermissionMissing=Vous n''avez pas l''autorisation pour créer des balises publiques, mais vous avez l''autorisation pour créer des balises privées.
tagNotFound=Balise introuvable
tagInvalidURL=Paramètre URL non valide
tagSharedDialog=Balise partagée
tagSharedURL=Vous pouvez partager cette balise à l''aide de cette URL :
tagCopyToClipBoard=Copier dans le presse-papiers
tagBrowseAndUploadImage=Naviguer et charger
tagCopiedLinkSuccessfully=Lien correctement copié dans le presse-papiers
tagCopiedLinkNotSuccessfully=Votre navigateur ne prend pas la copie vers le presse-papiers en charge. Veuillez copier le lien manuellement.
username=Nom d''utilisateur
confirm=Confirmer
cancel=Annuler
close=Fermer
boatClasses=Catégories de bateaux
sailorProfiles=Profils de sportifs
unknownSailorProfile=Impossible de charger le profil {0}. Êtes-vous connecté avec l''utilisateur approprié ?
profileName=Nom du profil
addSailorProfileMessage=Ajouter un nouveau profil de sportif
badges=Badges
newSailorProfileName=Nouveau profil de sportif
maxSpeedTitle=Vitesse maximale
maxStartLineSpeed=Vitesse maximale lors du passage de la ligne de départ
shortestDistanceToStartline=Distance minimale de la ligne de départ au début de la course
averageDistanceToStartLine=Distance moyenne de la ligne de départ au début de la course
metersValue={0,number,#0.0} m
showInRaceboard=Afficher sur le tableau des courses
showInDataMining=Afficher dans Exploration de données
couldNotDetermineStatistic=Impossible de calculer les statistiques
noEventsFoundForCompetitors=Aucun événement n''est disponible pour les concurrents sélectionnés.
noStatisticsFoundForCompetitors=Aucune statistique n''est disponible pour les concurrents sélectionnés.
pleaseSelectCompetitorFirst=Veuillez d''abord sélectionner un concurrent.
sailorProfileRemoveMessage=Voulez-vous vraiment supprimer ce profil de sportif ?
moreLoginInformationSectionSailorProfilesDescription=Une fois connecté(e), vous trouverez désormais un nouvel espace dans votre profil utilisateur, appelé Profils de sportifs. Vous pouvez ajouter des concurrents à un profil de sportif et accéder à des analyses approfondies de ces concurrents. Dans un profil de sportif, vous pouvez afficher tous les événements auxquels vos concurrents préférés ont participé et comparer leur positionnement les uns par rapport aux autres. De plus, vous pouvez accéder à une synthèse des statistiques les plus importantes, telles que la vitesse maximale ou la distance moyenne de la ligne de départ avec des liens vers la carte de la course afin de déterminer le moment exact où, par exemple, le concurrent le plus rapide a atteint son record. Pour accéder à des statistiques agrégées comme la distance moyenne de la ligne de départ au début de la course, vous pouvez cliquer sur la flèche et allez être guidé vers l''écran Exploration des données où vous pourrez explorer en avant jusqu''aux moyennes.
moreLoginInformationSectionSailorProfilesHeading=Profils de sportifs
confirmDeletion=Confirmer la suppression
@@ -2096,3 +2096,92 @@ resizeSuccessfull=リサイズが正常に終了しました
resizeUnsuccessfull=リサイズが可能でありません
setUpStorageService=最初にファイルストレージサービスを設定してください
automaticResizeNeedsStorageService=自動リサイズには機能している FileStorageService が必要です。
qrCodeTitle={0} さん、{1} へようこそ
qrCodeSubtitle={0} - {1}
qrCodeInfoMessage=スマートフォンでこの QR コードをスキャンしてイベントに参加してください
qrCodeErrorMessage=この機能は現在使用できません
qrCodeTitleBouy={0} のブイテンダーとしてようこそ
tag=タグ
tagButtons=タグボタン
tagPanel=タグ
tagCreated=({1}、{0} が登録)
tagNoTagsFound=タグが見つかりません
tagAddTag=タグ追加
tagEditTag=タグ編集
tagDeleteTag=タグ削除
tagShareTag=タグ共有
tagAddTags=タグ追加
tagSavedSuccessfully=タグが保存されました
tagNotSaved=タグを保存できませんでした
tagNotSavedReason=タグを保存できませんでした。原因: {0}
tagAlreadyExists=タグがすでに存在します
tagNotLoaded=タグをロードできませんでした
tagNotLoggedIn=ログインして新しいタグを追加してください
tagNotRemoved=タグを削除できませんでした
tagRemovedSuccessfully=タグが削除されました
tagFilterExplanation=フィルタは以下の基準に一致するすべてのタグを表示します。フィルタは大文字/小文字を区別します
tagSelectedTags=選択されたタグ
tagsFilter=タグフィルタ
tagSearchTags=検索
tagLabelTag=タグ
tagLabelComment=コメント
tagLabelImage=画像
tagLabelAction=アクション
tagLabelVisibility=可視性
tagCreateTag=タグ登録
tagEditCustomTagButtons=タグボタン編集
tagAddCustomTagButton=タグボタン追加
tagNotSpecified=タグは空にできません
tagEditFilter=フィルタ編集
tagEditCustomTagButton=タグボタン編集
tagSaveCustomTagButton=保存
tagPreview=タグプレビュー:
tagVisibleForPublicCheckBox=公開表示
tagVisibility=可視性
tagConfirmDeletionHeading=タグ削除
tagConfirmDeletion=これはタグ "{0}" を削除します。続行しますか
tagButtonConfirmDeletionHeading=タグボタン削除
tagButtonConfirmDeletion=これはタグボタン "{0}" を削除します。続行しますか
tagDiscardChangesHeading=変更内容の取消
tagDiscardChanges=変更内容を取り消しますか
tagFilterNotSavable=サーバでフィルタ設定を保存できませんでした
tagCurrentFilter=現在のフィルタ:
tagCreateFilterNotLoggedIn=ログインしていないため、フィルタは保存されません
tagCreateFilterHint=タグの一覧をフィルタリングするフィルタセットを登録してください。
tagButtonNotSavable=サーバでタグボタンを保存できませんでした
tagNotEditable=このタグは編集しないでください
tagPublicModificationPermissionMissing=公開タグを登録する権限はありませんが、非公開タグの登録は許可されています
tagNotFound=タグが見つかりませんでした
tagInvalidURL=URL パラメータが無効です
tagSharedDialog=共有タグ
tagSharedURL=以下の URL を渡すことによってこのタグを共有できます:
tagCopyToClipBoard=クリップボードにコピー
tagBrowseAndUploadImage=ブラウズしてアップロード
tagCopiedLinkSuccessfully=クリップボードにリンクがコピーされました
tagCopiedLinkNotSuccessfully=ブラウザがクリップボードへのコピーをサポートしていません。マニュアルでリンクをコピーしてください
username=ユーザ名
confirm=確認
cancel=取消
close=終了
boatClasses=艇種
sailorProfiles=セーラープロファイル
unknownSailorProfile=プロファイル {0} をロードできませんでした。適切なユーザとしてログインしていますか
profileName=プロファイル名
addSailorProfileMessage=新規セーラープロファイル追加
badges=バッジ
newSailorProfileName=新規セーラープロファイル
maxSpeedTitle=最大速度
maxStartLineSpeed=スタートライン横断時の最大速度
shortestDistanceToStartline=レーススタート時のスタートラインまでの最小距離
averageDistanceToStartLine=レーススタート時のスタートラインまでの平均距離
metersValue={0,number,#0.0} m
showInRaceboard=レースボードに表示
showInDataMining=データマイニングで表示
couldNotDetermineStatistic=統計を計算できませんでした
noEventsFoundForCompetitors=選択された競技者に利用可能なイベントがありません。
noStatisticsFoundForCompetitors=選択された競技者に利用可能な統計がありません。
pleaseSelectCompetitorFirst=最初に競技者を選択してください。
sailorProfileRemoveMessage=このセーラープロファイルを削除しますか
moreLoginInformationSectionSailorProfilesDescription=ログインすると、セーラープロファイルと呼ばれるユーザプロファイルの下に新しい領域が表示されます。そうしたセーラープロファイルに競技者を追加して、これらの競技者についてさらにインサイトを得ることができます。セーラープロファイルでは、お気に入りの競技者が参加しているすべてのイベントを表示でき、競技者間で順位を比較できます。さらに、たとえば最速の競技者がその記録に達するなどした正確な時点を表示するレースマップへの直接のリンクとともに、最大速度やスタートラインまでの距離など、最も重要な統計についての概要が得られます。レーススタート時のスタートラインまでの平均距離といった集約的な統計について、矢印をクリックして、平均値をドリルダウンできるデータマイニングに進むことができます。
moreLoginInformationSectionSailorProfilesHeading=セーラープロファイル
confirmDeletion=削除確認
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Redimensionamento concluído com êxito
resizeUnsuccessfull=Redimensionamento não possível
setUpStorageService=Configure primeiro um serviço de armazenamento de arquivo
automaticResizeNeedsStorageService=O redimensionamento automático precisa de um FileStorageService que funcione.
qrCodeTitle=Bem-vindo(a) {0} a {1}!
qrCodeSubtitle={0} - {1}
qrCodeInfoMessage=Digitalize este código QR com seu smartphone para participar do evento!
qrCodeErrorMessage=Esta funcionalidade não está disponível no momento!
qrCodeTitleBouy=Bem-vindo(a) como um navio-balizador para {0}
tag=Etiqueta
tagButtons=Botões de etiqueta
tagPanel=Etiquetas
tagCreated=({1}, criado por {0})
tagNoTagsFound=Nenhuma etiqueta encontrada.
tagAddTag=Adicionar etiqueta
tagEditTag=Processar etiqueta
tagDeleteTag=Eliminar etiqueta
tagShareTag=Compartilhar etiqueta
tagAddTags=Adicionar etiquetas
tagSavedSuccessfully=Etiqueta gravada com êxito
tagNotSaved=Não foi possível gravar etiqueta.
tagNotSavedReason=Não foi possível gravar etiqueta. Motivo: {0}
tagAlreadyExists=A etiqueta já existe
tagNotLoaded=Não foi possível carregar etiquetas.
tagNotLoggedIn=Efetue o logon para adicionar etiquetas novas.
tagNotRemoved=Não foi possível remover etiqueta.
tagRemovedSuccessfully=Etiqueta removida com êxito
tagFilterExplanation=O filtro exibirá todas as etiquetas correspondentes aos critérios seguintes. Os filtros diferenciam maiúsculas de minúsculas.
tagSelectedTags=Etiquetas selecionadas
tagsFilter=Filtro de etiquetas
tagSearchTags=Procurar
tagLabelTag=Etiqueta
tagLabelComment=Comentário
tagLabelImage=Imagem
tagLabelAction=Ação
tagLabelVisibility=Visibilidade
tagCreateTag=Criar etiqueta
tagEditCustomTagButtons=Processar botões de etiqueta
tagAddCustomTagButton=Adicionar botão de etiqueta
tagNotSpecified=A etiqueta não deve estar em branco.
tagEditFilter=Processar filtro
tagEditCustomTagButton=Processar botão de etiqueta
tagSaveCustomTagButton=Gravar
tagPreview=Visualização de etiqueta
tagVisibleForPublicCheckBox=Visível para público
tagVisibility=Visibilidade
tagConfirmDeletionHeading=Eliminar etiqueta
tagConfirmDeletion=Isso irá eliminar a etiqueta "{0}". Continuar?
tagButtonConfirmDeletionHeading=Eliminar botão de etiqueta
tagButtonConfirmDeletion=Isso irá eliminar o botão de etiqueta "{0}". Continuar?
tagDiscardChangesHeading=Rejeitar modificações
tagDiscardChanges=Rejeitar as modificações?
tagFilterNotSavable=Não foi possível gravar as configurações do filtro no servidor.
tagCurrentFilter=Filtro atual:
tagCreateFilterNotLoggedIn=Você não tem o logon efetuado, por isso os filtros não serão gravados.
tagCreateFilterHint=Criar um filtro definido para filtrar a lista de etiquetas.
tagButtonNotSavable=Não foi possível gravar o botão de etiqueta no servidor.
tagNotEditable=Você não pode processar esta etiqueta.
tagPublicModificationPermissionMissing=Você não pode criar etiquetas públicas, mas pode criar etiquetas privadas.
tagNotFound=Não foi possível encontrar etiqueta.
tagInvalidURL=Parâmetro de URL inválido
tagSharedDialog=Etiqueta compartilhada
tagSharedURL=Você pode compartilhar esta etiqueta, transferindo o seguinte URL:
tagCopyToClipBoard=Copiar para o clipboard
tagBrowseAndUploadImage=Navegar e carregar
tagCopiedLinkSuccessfully=Link copiado com êxito para o clipboard.
tagCopiedLinkNotSuccessfully=Seu browser não suporta a cópia para o clipboard. Copie o link manualmente.
username=Nome do usuário
confirm=Confirmar
cancel=Cancelar
close=Fechar
boatClasses=Classes de barcos
sailorProfiles=Perfis de velejadores
unknownSailorProfile=Não foi possível carregar perfil {0}, você tem o logon efetuado com o usuário correto?
profileName=Nome do perfil
addSailorProfileMessage=Adicionar um novo perfil de velejador
badges=Emblemas
newSailorProfileName=Novo perfil de velejador
maxSpeedTitle=Velocidade máxima
maxStartLineSpeed=Velocidade máxima ao passar a linha de partida
shortestDistanceToStartline=Distância mínima para linha de partida no início da corrida
averageDistanceToStartLine=Distância média para linha de partida no início da corrida
metersValue={0,number,#0.0} m
showInRaceboard=Exibir no painel de corridas
showInDataMining=Exibir no data mining
couldNotDetermineStatistic=Não foi possível calcular estatística
noEventsFoundForCompetitors=Não existem eventos disponíveis para os competidores selecionados.
noStatisticsFoundForCompetitors=Não existem estatísticas disponíveis para os competidores selecionados.
pleaseSelectCompetitorFirst=Selecione primeiro um competidor.
sailorProfileRemoveMessage=Remover este perfil de velejador?
moreLoginInformationSectionSailorProfilesDescription=Após o logon, você pode agora encontrar uma nova área no seu perfil de usuário, chamada Perfis de velejadores. Você pode adicionar alguns competidores a um perfil de velejador e obter mais informações sobre esses competidores. Em um perfil de velejador, você pode ver todos os eventos dos quais seus competidores favoritos participaram e comparar seus posicionamentos. Adicionalmente, você obtém uma síntese das estatísticas mais importantes, como a velocidade máxima ou a distância média para a linha de partida com links diretos para o mapa da corrida de modo a ver o momento exato em que, por exemplo, o competidor mais rápido atingiu seu recorde. Para estatísticas coletivas, como a distância média para a linha de partida no início da corrida, você pode clicar na seta e é encaminhado para o data mining onde pode pesquisar os valores médios.
moreLoginInformationSectionSailorProfilesHeading=Perfis de velejadores
confirmDeletion=Confirmar eliminação
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Изменение размера завершено
resizeUnsuccessfull=Изменение размера невозможно
setUpStorageService=Сначала настройте сервис памяти файлов
automaticResizeNeedsStorageService=Для автоматического изменения размера требуется работающий сервис памяти файлов (FileStorageService).
qrCodeTitle={0}, добро пожаловать в {1}!
qrCodeSubtitle={0} - {1}
qrCodeInfoMessage=Отсканируйте этот QR-код с помощью смартфона, чтобы участвовать в событии!
qrCodeErrorMessage=Приносим извинения, эта функция сейчас недоступна!
qrCodeTitleBouy=Добро пожаловать в качестве лоцмейстерского судна на {0}
tag=Тег
tagButtons=Кнопки тегирования
tagPanel=Теги
tagCreated=({1}, создал {0})
tagNoTagsFound=Теги не найдены!
tagAddTag=Добавить тег
tagEditTag=Редактировать тег
tagDeleteTag=Удалить тег
tagShareTag=Поделиться тегом
tagAddTags=Добавить теги
tagSavedSuccessfully=Тег сохранен
tagNotSaved=Не удалось сохранить тег.
tagNotSavedReason=Не удалось сохранить тег. Причина: {0}
tagAlreadyExists=Тег уже существует
tagNotLoaded=Не удалось загрузить теги.
tagNotLoggedIn=Выполните вход, чтобы добавить новые теги.
tagNotRemoved=Не удалось удалить тег.
tagRemovedSuccessfully=Тег удален
tagFilterExplanation=После применения фильтра будут показаны все теги, соответствующие следующим критериям. Фильтры чувствительны к прописным/строчным буквам!
tagSelectedTags=Выбранные теги
tagsFilter=Фильтр тегов
tagSearchTags=Поиск
tagLabelTag=Тег
tagLabelComment=Комментарий
tagLabelImage=Изображение
tagLabelAction=Действие
tagLabelVisibility=Видимость
tagCreateTag=Создать тег
tagEditCustomTagButtons=Кнопки редактирования тега
tagAddCustomTagButton=Кнопка добавления тега
tagNotSpecified=Тег не должен быть пустым!
tagEditFilter=Изменить фильтр
tagEditCustomTagButton=Кнопка редактирования тега
tagSaveCustomTagButton=Сохранить
tagPreview=Предпросмотр тега:
tagVisibleForPublicCheckBox=Видимый для всех
tagVisibility=Видимость
tagConfirmDeletionHeading=Удалить тег
tagConfirmDeletion=При этом будет удален тег "{0}". Продолжить?
tagButtonConfirmDeletionHeading=Кнопка удаления тега
tagButtonConfirmDeletion=При этом будет удалена кнопка тега "{0}". Продолжить?
tagDiscardChangesHeading=Отменить изменения
tagDiscardChanges=Действительно отменить изменения?
tagFilterNotSavable=Не удалось сохранить на сервере настройки фильтра.
tagCurrentFilter=Текущий фильтр:
tagCreateFilterNotLoggedIn=Вы не вошли в систему, поэтому фильтры не будут сохранены.
tagCreateFilterHint=Создание набора фильтров для фильтрации списка тегов.
tagButtonNotSavable=Не удалось сохранить на сервере кнопку тега.
tagNotEditable=Вы не можете редактировать этот тег!
tagPublicModificationPermissionMissing=У вас нет разрешения создавать общедоступные теги, но вы можете создавать личные теги.
tagNotFound=Не удалось найти тег.
tagInvalidURL=Недействительный параметр URL
tagSharedDialog=Общий тег
tagSharedURL=Вы можете поделиться этим тегом, отправив следующий URL-адрес:
tagCopyToClipBoard=Копировать в буфер обмена
tagBrowseAndUploadImage=Найти и загрузить
tagCopiedLinkSuccessfully=Ссылка скопирована в буфер обмена.
tagCopiedLinkNotSuccessfully=Ваш браузер не поддерживает копирование в буфер обмена, скопируйте ссылку вручную.
username=Имя пользователя
confirm=Подтвердить
cancel=Отменить
close=Закрыть
boatClasses=Классы лодок
sailorProfiles=Профили участников гонки
unknownSailorProfile=Не удалось загрузить профиль {0}, вы выполнили вход, используя правильного пользователя?
profileName=Имя профиля
addSailorProfileMessage=Добавить новый профиль участника
badges=Значки
newSailorProfileName=Новый профиль участника
maxSpeedTitle=Максимальная скорость
maxStartLineSpeed=Максимальная скорость при пересечении линии старта
shortestDistanceToStartline=Минимальное расстояние до линии старта на старте гонки
averageDistanceToStartLine=Среднее расстояние до линии старта на старте гонки
metersValue={0,number,#0.0} м
showInRaceboard=Показать в таблице гонки
showInDataMining=Показать в добыче данных
couldNotDetermineStatistic=Не удалось рассчитать статистику
noEventsFoundForCompetitors=Нет событий, доступных для выбранных участников.
noStatisticsFoundForCompetitors=Нет статистики, доступной для выбранных участников.
pleaseSelectCompetitorFirst=Сначала выберите участника.
sailorProfileRemoveMessage=Действительно удалить этот профиль участника?
moreLoginInformationSectionSailorProfilesDescription=После входа в приложение в области профиля вашего пользователя вы увидите область, называемую "Профили участников". В этот профиль можно добавить участников и узнать о них подробнее. В профиле участника можно просмотреть все события, в которых участвовали ваши выбранные участники, и сравнить их результаты. Также здесь представлен обзор важных статистик, как например максимальная скорость или среднее расстояние до линии старта, с прямыми ссылками на карту гонки, где можно узнать точное время, например рекорд самого быстрого участника. Для получения агрегированной статистики, например среднего расстояния до линии старта на старте гонки, можно щелкнуть значок стрелки, будет выполнен переход в добычу данных, где можно просмотреть средние значения.
moreLoginInformationSectionSailorProfilesHeading=Профили участников гонки
confirmDeletion=Подтвердить удаление
@@ -2096,3 +2096,92 @@ resizeSuccessfull=重新调整大小已成功完成
resizeUnsuccessfull=无法重新调整大小
setUpStorageService=请先设置文件存储服务
automaticResizeNeedsStorageService=自动重新调整大小需要正常运行的 FileStorageService。
qrCodeTitle=欢迎{0}使用{1}!
qrCodeSubtitle={0} - {1}
qrCodeInfoMessage=请用智能手机扫描此二维码,参与此活动!
qrCodeErrorMessage=抱歉,此功能目前无法使用!
qrCodeTitleBouy=欢迎{0}的浮标供应船
tag=标记
tagButtons=标记按钮
tagPanel=标记
tagCreated=({1},创建人:{0})
tagNoTagsFound=未找到标记!
tagAddTag=添加标记
tagEditTag=编辑标记
tagDeleteTag=删除标记
tagShareTag=共享标记
tagAddTags=添加标记
tagSavedSuccessfully=已成功保存标记
tagNotSaved=无法保存标记!
tagNotSavedReason=无法保存标记!原因:{0}
tagAlreadyExists=标记已存在
tagNotLoaded=无法加载标记!
tagNotLoggedIn=请登录以添加新标记!
tagNotRemoved=无法移除标记!
tagRemovedSuccessfully=已成功移除标记
tagFilterExplanation=筛选器将显示符合以下条件的所有标记。筛选器区分大小写!
tagSelectedTags=已选标记
tagsFilter=标记筛选器
tagSearchTags=搜索
tagLabelTag=标记
tagLabelComment=评论
tagLabelImage=图像
tagLabelAction=操作
tagLabelVisibility=可见性
tagCreateTag=创建标记
tagEditCustomTagButtons=创建标记按钮
tagAddCustomTagButton=添加标记按钮
tagNotSpecified=标记不得为空!
tagEditFilter=编辑筛选器
tagEditCustomTagButton=编辑标记按钮
tagSaveCustomTagButton=保存
tagPreview=标记预览:
tagVisibleForPublicCheckBox=对公众可见
tagVisibility=可见性
tagConfirmDeletionHeading=删除标记
tagConfirmDeletion=将删除标记 "{0}"。是否确定继续?
tagButtonConfirmDeletionHeading=删除标记按钮
tagButtonConfirmDeletion=将删除标记按钮 "{0}"。是否确定继续?
tagDiscardChangesHeading=放弃更改
tagDiscardChanges=是否确定要放弃您的更改?
tagFilterNotSavable=无法在服务器中保存筛选器设置!
tagCurrentFilter=当前筛选器:
tagCreateFilterNotLoggedIn=您尚未登录,因此无法保存筛选器!
tagCreateFilterHint=创建筛选器集,筛选标记清单。
tagButtonNotSavable=无法在服务器中保存标记按钮!
tagNotEditable=不能编辑此标记!
tagPublicModificationPermissionMissing=不允许创建公共标记,但是允许创建个人标记。
tagNotFound=无法找到标记!
tagInvalidURL=URL 参数无效
tagSharedDialog=已共享标记
tagSharedURL=您可以通过传递以下 URL 来共享此标记:
tagCopyToClipBoard=复制到剪贴板
tagBrowseAndUploadImage=浏览并上传
tagCopiedLinkSuccessfully=已将链接成功复制到剪贴板!
tagCopiedLinkNotSuccessfully=您的浏览器不支持复制到剪贴板,请手动复制链接!
username=用户名
confirm=确认
cancel=取消
close=关闭
boatClasses=船只级别
sailorProfiles=水手资料
unknownSailorProfile=无法加载资料{0},您是否以正确的用户登录?
profileName=资料名称
addSailorProfileMessage=添加新水手资料
badges=徽章
newSailorProfileName=新水手资料
maxSpeedTitle=最大速度
maxStartLineSpeed=越过起航线时的最大速度
shortestDistanceToStartline=比赛轮次开始时与起航线的最小距离
averageDistanceToStartLine=比赛轮次开始时与起航线的平均距离
metersValue={0,number,#0.0} m
showInRaceboard=在比赛板中显示
showInDataMining=在数据挖掘中显示
couldNotDetermineStatistic=无法计算统计
noEventsFoundForCompetitors=所选参赛队没有可用的活动。
noStatisticsFoundForCompetitors=所选参赛队没有可用的统计。
pleaseSelectCompetitorFirst=请先选择参赛队。
sailorProfileRemoveMessage=是否确定要移除此水手资料?
moreLoginInformationSectionSailorProfilesDescription=登录后,您现在可以在用户资料下找到一个新区域,即“水手资料”。您可以将一些参赛队添加到此“水手资料”,并获得有关这些参赛队的更多全面信息。在“水手资料”中,您可以看到收藏的参赛队参与的所有活动,并对其布置进行相互比较。此外,您可以获得最重要统计的总览,例如最大速度或与起航线的平均距离及到比赛轮次地图的直接链接,以查看确切的时间点,如最快的参赛队达到其记录。对于比赛轮次开始时与起航线的平均距离等汇总统计,您可以点击箭头,转到数据挖掘,您可以在其中细分平均值。
moreLoginInformationSectionSailorProfilesHeading=水手资料
confirmDeletion=确认删除
@@ -7,6 +7,7 @@ import java.util.Map;
import java.util.Set;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -16,6 +17,8 @@ import com.google.gwt.user.client.ui.HeaderPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.CellPreviewEvent.Handler;
import com.google.gwt.view.client.NoSelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
@@ -116,8 +119,8 @@ public class TaggingPanel extends ComponentWithoutSettings
* 3) another user adds/deletes/changes any tag between the latest received tag and the current timer position<br/>
* consecutively, the timer would jump to this new tag as the selection would change automatically as the latest tag
* changed. This selection change would also trigger the timer to jump to the latest tag, which is not intended in
* this case. Therefor any received changes on any tags will set this boolen to true which will ignore the time jump
* at the selection change event and prevent this wrong behaviour.
* this case. Therefor any received changes on any tags will set this boolean to true which will ignore the time jump
* at the selection change event and prevent this wrong behavior.
*
* @see #raceTimesInfosReceived(Map, long, Date, long)
*/
@@ -181,26 +184,31 @@ public class TaggingPanel extends ComponentWithoutSettings
tagCellList.setEmptyListWidget(new Label(stringMessages.tagNoTagsFound()));
tagCellList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED);
tagCellList.setSelectionModel(tagSelectionModel);
tagSelectionModel.addSelectionChangeHandler(event -> {
// set time slider to corresponding position
TagDTO selectedTag = tagSelectionModel.getSelectedObject();
if (selectedTag != null) {
/**
* Do not set time of timer when {@link #preventTimeJumpAtSelectionChangeForOnce} is set to
* <code>true</code>. In this case set {@link #preventTimeJumpAtSelectionChangeForOnce} to
* <code>false</code> as selection change is ignored once.
*
* @see #preventTimeJumpAtSelectionChangeForOnce
*/
if (preventTimeJumpAtSelectionChangeForOnce) {
preventTimeJumpAtSelectionChangeForOnce = false;
} else {
// remove time change listener when manual selecting tag cells as this could end in an infinite loop
// of timer change -> automatic selection change -> timer change -> ...
timer.removeTimeListener(this);
timer.setTime(selectedTag.getRaceTimepoint().asMillis());
// adding time change listener again
timer.addTimeListener(this);
tagCellList.addCellPreviewHandler(new Handler<TagDTO>() {
@Override
public void onCellPreview(CellPreviewEvent<TagDTO> event) {
if (BrowserEvents.CLICK.equals(event.getNativeEvent().getType())) {
// set time slider to corresponding position
TagDTO selectedTag = event.getValue();
if (selectedTag != null) {
/**
* Do not set time of timer when {@link #preventTimeJumpAtSelectionChangeForOnce} is set to
* <code>true</code>. In this case set {@link #preventTimeJumpAtSelectionChangeForOnce} to
* <code>false</code> as selection change is ignored once.
*
* @see #preventTimeJumpAtSelectionChangeForOnce
*/
if (preventTimeJumpAtSelectionChangeForOnce) {
preventTimeJumpAtSelectionChangeForOnce = false;
} else {
// remove time change listener when manually selecting tag cells as this could end in an infinite loop
// of timer change -> automatic selection change -> timer change -> ...
timer.removeTimeListener(TaggingPanel.this);
timer.setTime(selectedTag.getRaceTimepoint().asMillis());
// adding time change listener again
timer.addTimeListener(TaggingPanel.this);
}
}
}
}
});
@@ -210,7 +218,6 @@ public class TaggingPanel extends ComponentWithoutSettings
createTagsButton.addClickHandler(event -> {
setCurrentState(State.CREATE_TAG);
});
taggingPanel.setContentWidget(contentPanel);
updateContent();
}
@@ -87,6 +87,7 @@
padding: 5px 5px 0;
border: 1px solid lightgrey;
border-radius: 3px;
cursor: pointer;
}
.tagCellHeading {
@@ -54,7 +54,6 @@ import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
import com.sap.sse.datamining.ui.client.DataMiningService;
import com.sap.sse.i18n.ResourceBundleStringMessages;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.UserStore;
import com.sap.sse.util.ServiceTrackerFactory;
public class DataMiningServiceImpl extends RemoteServiceServlet implements DataMiningService {
@@ -64,7 +63,6 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
private final ServiceTracker<DataMiningServer, DataMiningServer> dataMiningServerTracker;
private final ServiceTracker<SecurityService, SecurityService> securityServiceTracker;
private final ServiceTracker<UserStore, UserStore> userStoreServiceTracker;
private final StoredDataMiningQueryPersister storedDataMiningQueryPersistor;
@@ -74,10 +72,8 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
context = Activator.getDefault();
dataMiningServerTracker = createAndOpenDataMiningServerTracker(context);
securityServiceTracker = ServiceTrackerFactory.createAndOpen(context, SecurityService.class);
userStoreServiceTracker = ServiceTrackerFactory.createAndOpen(context, UserStore.class);
storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(securityServiceTracker.getService(),
userStoreServiceTracker.getService());
storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(securityServiceTracker.getService());
dtoFactory = new DataMiningDTOFactory();
}
@@ -18,18 +18,14 @@ import com.sap.sse.datamining.shared.impl.dto.StoredDataMiningQueryDTOImpl;
import com.sap.sse.gwt.dispatch.shared.exceptions.ServerDispatchException;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.User;
import com.sap.sse.security.UserStore;
/** Implementation of {@link StoredDataMiningQueryPersister}. */
public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQueryPersister {
private final SecurityService securityService;
private final UserStore userStore;
public StoredDataMiningQueryPersisterImpl(SecurityService securityService, UserStore userStore) {
public StoredDataMiningQueryPersisterImpl(SecurityService securityService) {
this.securityService = securityService;
this.userStore = userStore;
}
/** @return all {@link StoredDataMiningQueryDTO}s the user has stored in his user store. */
@@ -101,7 +97,7 @@ public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQuery
User currentUser = securityService.getCurrentUser();
if (currentUser != null) {
try {
userStore.setPreferenceObject(currentUser.getName(), preferenceKey, preference);
securityService.setPreferenceObject(currentUser.getName(), preferenceKey, preference);
} catch (AuthorizationException e) {
throw new ServerDispatchException(e);
}
@@ -124,9 +120,8 @@ public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQuery
private <T> T getPreferenceForCurrentUser(String preferenceKey) {
User currentUser = securityService.getCurrentUser();
if (currentUser != null) {
return userStore.getPreferenceObject(currentUser.getName(), preferenceKey);
return securityService.getPreferenceObject(currentUser.getName(), preferenceKey);
}
return null;
}
}
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=El nombre de la columna Carrera ya se está util
slicingTimeRangeOutOfBounds=El intervalo de tiempo para la división no forma parte de la carrera
slicingCouldNotObtainRace=No se ha podido obtener la carrera dividida
slicingError=Error al dividir la carrera
unknownError=Error desconocido
missingAuthorization=No ha iniciado la sesión o no dispone del permiso requerido
securityServiceNotFound=No existe servicio de seguridad
raceLogNotFound=No existe el registro de carrera
tagNotRevokable=Esta etiqueta no se puede revocar
tagAlreadyExists=Ya existe la etiqueta, no se permiten etiquetas duplicadas
invalidParameters=Uno de los parámetros indicados no tiene un valor válido
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=Le nom de colonne de la course est déjà utilis
slicingTimeRangeOutOfBounds=L''intervalle de temps à segmenter n''est pas compris dans la course.
slicingCouldNotObtainRace=Impossible d''accéder à la course segmentée
slicingError=Erreur lors de la segmentation de la course.
unknownError=Erreur inconnue
missingAuthorization=Vous n''êtes pas connecté(e) ou vous ne disposez pas des autorisations requises.
securityServiceNotFound=Service de sécurité introuvable
raceLogNotFound=Journal de la course introuvable
tagNotRevokable=Cette balise ne peut pas être annulée.
tagAlreadyExists=La balise existe déjà. Les balises en double ne sont pas autorisées.
invalidParameters=L''un des paramètres donnés a une valeur non valide.
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=指定したレガッタでレース列名がす
slicingTimeRangeOutOfBounds=スライスしようとしている TimeRange はレースの一部ではありません
slicingCouldNotObtainRace=スライスされたレースを取得できませんでした
slicingError=レースのスライスでエラーが発生しました
unknownError=不明なエラー
missingAuthorization=ログインしていないか、必要な権限がありません
securityServiceNotFound=セキュリティサービスが見つかりません
raceLogNotFound=レースログが見つかりません
tagNotRevokable=このタグは取消ができません
tagAlreadyExists=タグがすでに存在しています。タグの重複は許されていません
invalidParameters=指定されたパラメータの 1 つに有効な値がありません
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=O nome da coluna da corrida já é utilizado na
slicingTimeRangeOutOfBounds=O intervalo de tempo para a divisão não faz parte da corrida
slicingCouldNotObtainRace=Não foi possível obter corrida dividida
slicingError=Erro ao dividir corrida
unknownError=Erro desconhecido
missingAuthorization=Você não tem o logon efetuado ou não tem a autorização necessária.
securityServiceNotFound=Serviço de segurança não encontrado.
raceLogNotFound=RaceLog não encontrado.
tagNotRevokable=Esta etiqueta não pode ser anulada.
tagAlreadyExists=A etiqueta já existe, não são permitidas etiquetas duplicadas.
invalidParameters=Um dos parâmetros indicados não tem um valor válido.
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=Имя столбца гонки уже испо
slicingTimeRangeOutOfBounds=Диапазон времени для среза не является частью гонки
slicingCouldNotObtainRace=Не удалось получить данные гонки, по которой делаются срезы
slicingError=Ошибка среза гонки
unknownError=Неизвестная ошибка
missingAuthorization=Вы не зарегистрированы, или у вас нет требуемого разрешения!
securityServiceNotFound=Сервис безопасности не найден!
raceLogNotFound=Журнал гонки не найден!
tagNotRevokable=Этот тег невозможно отозвать!
tagAlreadyExists=Тег уже существует, дубликаты тегов не разрешены!
invalidParameters=Один из указанных параметров не имеет действительного значения!
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=比赛轮次列名称已在给定比赛中使用
slicingTimeRangeOutOfBounds=用于划分的时间范围不是比赛轮次的一部分
slicingCouldNotObtainRace=无法获取划分的比赛轮次
slicingError=划分比赛轮次出错
unknownError=未知错误
missingAuthorization=您尚未登录或缺少所需的权限!
securityServiceNotFound=未找到安全服务!
raceLogNotFound=未找到比赛轮次日志!
tagNotRevokable=无法撤销此标记!
tagAlreadyExists=标记已存在,不允许重复的标记!
invalidParameters=其中一个给定参数没有有效值!
@@ -56,6 +56,10 @@ public class FileUploadServlet extends AbstractFileUploadServlet {
fileExtension = ".jpg";
} else if (fileType.equals("image/png")) {
fileExtension = ".png";
} else if (fileType.equals("image/gif")) {
fileExtension = ".gif";
} else if (fileType.startsWith("video/")) {
fileExtension = fileType.substring(fileType.indexOf('/')+1);
} else {
int lastDot = fileName.lastIndexOf(".");
if (lastDot > 0) {
@@ -15,7 +15,7 @@ import org.json.simple.parser.ParseException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sse.security.UserStore;
import com.sap.sse.security.SecurityService;
@Path("/v1/preferences")
public class PreferencesResource extends AbstractSailingServerResource {
@@ -27,8 +27,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
Response response = null;
if (SecurityUtils.getSubject().isAuthenticated()) {
String username = SecurityUtils.getSubject().getPrincipal().toString();
UserStore userStore = getService(UserStore.class);
String settings = userStore.getPreference(username, settingsKey);
SecurityService securityService = getService(SecurityService.class);
String settings = securityService.getPreference(username, settingsKey);
if (settings == null) {
response = Response.noContent().build();
} else {
@@ -48,8 +48,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
Response response = null;
if (SecurityUtils.getSubject().isAuthenticated()) {
String username = SecurityUtils.getSubject().getPrincipal().toString();
UserStore userStore = getService(UserStore.class);
userStore.setPreference(username, settingsKey, json);
SecurityService securityService = getService(SecurityService.class);
securityService.setPreference(username, settingsKey, json);
response = Response.ok().build();
} else {
response = Response.status(401).build();
@@ -65,8 +65,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
Response response = null;
if (SecurityUtils.getSubject().isAuthenticated()) {
String username = SecurityUtils.getSubject().getPrincipal().toString();
UserStore userStore = getService(UserStore.class);
userStore.unsetPreference(username, settingsKey);
SecurityService securityService = getService(SecurityService.class);
securityService.unsetPreference(username, settingsKey);
response = Response.ok().build();
} else {
response = Response.status(401).build();
@@ -15,11 +15,6 @@ import com.sap.sse.common.TypeBasedServiceFinder;
* servers. Implementations of this service are announced via the OSGi service registry. They should provide their name
* as the OSGi property {@link TypeBasedServiceFinder#TYPE type};
*
* TODO The storage service to use should be configured via the AdminConsole. Upon auto-discovering the available
* services, the AdminConsole should allow to edit properties for each service (e.g. access credentials for AWS S3). We
* probably need a generic property discovery mechanism (key-value based?), and to survive server restarts these
* properties should be saved to the MongoDB.
*
* @author Fredrik Teschke
*
*/
@@ -158,6 +158,12 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
*/
String getPreference(String username, String key);
/**
* Gets a preference object. Always returns null if there is no converter associated with the given key -> see
* {@link #registerPreferenceConverter(String, PreferenceConverter)}.
*/
<T> T getPreferenceObject(String username, String key);
/**
* @return all preferences of the given user
*/
@@ -195,5 +201,4 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
void removeAccessToken(String username);
User loginByAccessToken(String accessToken);
}
@@ -1096,4 +1096,10 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
((ReplicatingCacheManager) cm).clear();
}
}
@Override
public <T> T getPreferenceObject(String username, String key) {
ensureThatUserInQuestionIsLoggedInOrCurrentUserIsAdmin(username);
return store.getPreferenceObject(username, key);
}
}
@@ -0,0 +1,22 @@
package com.sap.sse.shared.android.test;
import static org.junit.Assert.assertEquals;
import java.util.Comparator;
import org.junit.Test;
import com.sap.sse.util.impl.ArrayListNavigableSet;
public class ArrayListNavigableSetTest {
@Test
public void testEqualityOfArrayListNavigableSet() {
ArrayListNavigableSet<Integer> a = new ArrayListNavigableSet<>(Comparator.naturalOrder());
ArrayListNavigableSet<Integer> b = new ArrayListNavigableSet<>(Comparator.naturalOrder());
a.add(1);
a.add(42);
b.add(42);
b.add(1);
assertEquals(a, b);
}
}
@@ -1,6 +1,7 @@
package com.sap.sse.util.impl;
import java.io.Serializable;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -38,7 +39,7 @@ import com.sap.sse.common.ReverseRandomAccessList;
*
* @author Axel Uhl (d043530)
*/
public class ArrayListNavigableSet<E> implements NavigableSet<E>, Serializable {
public class ArrayListNavigableSet<E> extends AbstractSet<E> implements NavigableSet<E>, Serializable {
private static final long serialVersionUID = 6923963699509907975L;
private final List<E> list;
private final Comparator<? super E> comparator;