diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java index 9253979a0c0..7ffada87c7e 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java @@ -117,6 +117,7 @@ public enum DetailType implements Serializable { RACE_TIME_TRAVELED_REACHING(0, ASCENDING), CHART_DISTANCE_TO_START_LINE(0, ASCENDING, "DISTANCE_TO_START_LINE"), CHART_BEAT_ANGLE(0, ASCENDING, "BEAT_ANGLE"), + CHART_ABS_TWA(0, ASCENDING), CHART_COURSE_OVER_GROUND_TRUE_DEGREES(0, ASCENDING, "COURSE_OVER_GROUND_TRUE_DEGREES"), OVERALL_TOTAL_SCORED_RACE_COUNT(0, ASCENDING, "TOTAL_SCORED_RACE_COUNT"), EXPEDITION_RACE_AWA(2, ASCENDING), @@ -261,6 +262,7 @@ public enum DetailType implements Serializable { availableDetailsTypes.add(DetailType.REGATTA_RANK); availableDetailsTypes.add(DetailType.CHART_DISTANCE_TO_START_LINE); availableDetailsTypes.add(DetailType.CHART_BEAT_ANGLE); + availableDetailsTypes.add(DetailType.CHART_ABS_TWA); availableDetailsTypes.add(DetailType.CHART_COURSE_OVER_GROUND_TRUE_DEGREES); availableDetailsTypes.add(DetailType.BRAVO_RACE_CURRENT_RIDE_HEIGHT_IN_METERS); availableDetailsTypes.add(DetailType.BRAVO_RACE_HEEL_IN_DEGREES); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java index 006988fe028..e4a07981d29 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java @@ -22,8 +22,6 @@ public class FinishedTimeFinder extends RaceLogAnalyzer { } } } - return null; } - } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java index bb5d74b37e9..ae4b65c7cf1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java @@ -74,7 +74,8 @@ public class RaceStatusAnalyzer extends RaceLogAnalyzer

What's New - SAP Sailing Analytics

+
June 2019
+
    +
  • The combined wind arrow on the top left of the map now switches through three states: + wind visualization off, wind visualization on, wind visualization on with color.
  • +
+
May 2019
  • Improvements for handicap regattas: when finishing times have been entered, leading to finish line diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java index 68e2e9fd6d4..6a7446ce6a8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java @@ -53,7 +53,7 @@ public class DeviceConfigurationDetailComposite extends Composite { private VerticalPanel contentPanel; private Button cloneButton; private Button updateButton; - protected DeviceConfigurationDTO originalConfiguration; + protected DeviceConfigurationWithSecurityDTO originalConfiguration; protected TextBox uuidBox; protected TextBox identifierBox; private StringListEditorComposite allowedCourseAreasList; @@ -64,7 +64,8 @@ public class DeviceConfigurationDetailComposite extends Composite { private final UserService userService; public static interface DeviceConfigurationFactory { - void obtainAndSetNameForConfigurationAndAdd(final DeviceConfigurationDTO configurationToObtainAndSetNameForAndAdd); + void obtainAndSetNameForConfigurationAndAdd(final DeviceConfigurationWithSecurityDTO configurationToObtainAndSetNameForAndAdd); + void update(DeviceConfigurationWithSecurityDTO configurationToUpdate); } public DeviceConfigurationDetailComposite(SailingServiceAsync sailingService, UserService userService, @@ -80,10 +81,10 @@ public class DeviceConfigurationDetailComposite extends Composite { cloneButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - updateConfiguration(); + updateConfiguration(callbackInterface); // create a new, cloned configuration object and set a new UUID; then ask for a name, // then send it to the server and add to the local list - final DeviceConfigurationDTO cloned = getResult(); + final DeviceConfigurationWithSecurityDTO cloned = getResult(); cloned.id = UUID.randomUUID(); callbackInterface.obtainAndSetNameForConfigurationAndAdd(cloned); } @@ -92,7 +93,7 @@ public class DeviceConfigurationDetailComposite extends Composite { updateButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - updateConfiguration(); + updateConfiguration(callbackInterface); } }); verticalPanel.add(contentPanel); @@ -249,8 +250,10 @@ public class DeviceConfigurationDetailComposite extends Composite { } } - private DeviceConfigurationDTO getResult() { - DeviceConfigurationDTO result = new DeviceConfigurationDTO(); + private DeviceConfigurationWithSecurityDTO getResult() { + DeviceConfigurationWithSecurityDTO result = new DeviceConfigurationWithSecurityDTO(originalConfiguration.getIdentifier()); + result.setOwnership(originalConfiguration.getOwnership()); + result.setAccessControlList(originalConfiguration.getAccessControlList()); result.name = identifierBox.getValue(); result.id = UUID.fromString(uuidBox.getValue()); if (!allowedCourseAreasList.getValue().isEmpty()) { @@ -268,16 +271,17 @@ public class DeviceConfigurationDetailComposite extends Composite { return result; } - private void updateConfiguration() { + private void updateConfiguration(DeviceConfigurationFactory callbackInterface) { if (originalConfiguration == null) { errorReporter.reportError(stringMessages.invalidState()); return; } - DeviceConfigurationDTO dto = getResult(); + DeviceConfigurationWithSecurityDTO dto = getResult(); sailingService.createOrUpdateDeviceConfiguration(dto, new MarkedAsyncCallback<>(new AsyncCallback() { @Override public void onSuccess(Void result) { markAsDirty(false); + callbackInterface.update(dto); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java index 88485e9b968..e5e00d4cace 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java @@ -71,17 +71,17 @@ public class DeviceConfigurationListComposite extends Composite { configurationTable.setVisible(true); refreshableConfigurationSelectionModel = new RefreshableMultiSelectionModel<>( new EntityIdentityComparator() { - @Override + @Override public boolean representSameEntity(DeviceConfigurationWithSecurityDTO dto1, DeviceConfigurationWithSecurityDTO dto2) { - return Util.equalsWithNull(dto1.id, dto2.id); - } + return Util.equalsWithNull(dto1.id, dto2.id); + } - @Override + @Override public int hashCode(DeviceConfigurationWithSecurityDTO t) { - return t.id == null ? 0 : t.id.hashCode(); - } - }, configurationsDataProvider); + return t.id == null ? 0 : t.id.hashCode(); + } + }, configurationsDataProvider); configurationTable.setSelectionModel(refreshableConfigurationSelectionModel); panel.add(configurationTable); initWidget(mainPanel); @@ -136,8 +136,6 @@ public class DeviceConfigurationListComposite extends Composite { final TextColumn deviceConfigurationUUidColumn = new AbstractSortableTextColumn( config -> config.id == null ? "" : config.id.toString()); - - final HasPermissions type = SecuredSecurityTypes.USER_GROUP; final AccessControlledActionsColumn actionColumn = create( new DefaultActionsImagesBarCell(stringMessages), userService); @@ -156,23 +154,27 @@ public class DeviceConfigurationListComposite extends Composite { }); } }); - final EditOwnershipDialog.DialogConfig configOwnership = EditOwnershipDialog .create(userService.getUserManagementService(), type, user -> refreshTable(), stringMessages); - final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, user -> user.getAccessControlList(), stringMessages); - actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.CHANGE_OWNERSHIP, configOwnership::openDialog); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, u -> configACL.openDialog(u)); - - SecuredDTOOwnerColumn.configureOwnerColumns(table, columnSortHandler, stringMessages); table.addColumn(deviceConfigurationUUidColumn, stringMessages.id()); table.addColumn(actionColumn, stringMessages.actions()); return table; } + void update(DeviceConfigurationWithSecurityDTO configurationToUpdate) { + final List configList = configurationsDataProvider.getList(); + for (int i=0; i(new AsyncCallback>() { @Override @@ -172,6 +172,11 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi })); } + @Override + public void update(DeviceConfigurationWithSecurityDTO configurationToUpdate) { + listComposite.update(configurationToUpdate); + } + private void removeConfiguration() { detailComposite.setConfiguration(null); for (DeviceConfigurationDTO config : refreshableMultiSelectionModel.getSelectedSet()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetFinishingAndFinishedTimeDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetFinishingAndFinishedTimeDialog.java index 0536837c45b..35c4a130b09 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetFinishingAndFinishedTimeDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetFinishingAndFinishedTimeDialog.java @@ -87,15 +87,17 @@ public class SetFinishingAndFinishedTimeDialog extends SetTimeDialog setFinishingAndEndTime(RaceLogSetFinishingAndFinishTimeDTO dto) throws NotFoundException { getSecurityService().checkCurrentUserUpdatePermission(getLeaderboardByName(dto.leaderboardName)); + final MillisecondsTimePoint finishingTimePoint = dto.finishingTime==null?null:new MillisecondsTimePoint(dto.finishingTime); TimePoint newFinsihingTime = getService().setFinishingTime(dto.leaderboardName, dto.raceColumnName, dto.fleetName, dto.authorName, dto.authorPriority, - dto.passId, new MillisecondsTimePoint(dto.finishingTime)); + dto.passId, finishingTimePoint); + final TimePoint finishTimePoint = dto.finishTime==null?null:new MillisecondsTimePoint(dto.finishTime); TimePoint newEndTime = getService().setEndTime(dto.leaderboardName, dto.raceColumnName, dto.fleetName, dto.authorName, dto.authorPriority, - dto.passId, new MillisecondsTimePoint(dto.finishTime)); + dto.passId, finishTimePoint); - return new Pair(new MillisecondsTimePoint(dto.finishingTime).equals(newFinsihingTime), - new MillisecondsTimePoint(dto.finishTime).equals(newEndTime)); + return new Pair(Util.equalsWithNull(finishingTimePoint, newFinsihingTime), + Util.equalsWithNull(finishTimePoint, newEndTime)); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationWithSecurityDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationWithSecurityDTO.java index 58b3b7b572e..83e215be2b5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationWithSecurityDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationWithSecurityDTO.java @@ -8,7 +8,7 @@ import com.sap.sse.security.shared.dto.OwnershipDTO; import com.sap.sse.security.shared.dto.SecuredDTO; import com.sap.sse.security.shared.dto.SecurityInformationDTO; -public class DeviceConfigurationWithSecurityDTO extends DeviceConfigurationDTO implements SecuredDTO{ +public class DeviceConfigurationWithSecurityDTO extends DeviceConfigurationDTO implements SecuredDTO { private static final long serialVersionUID = 7187283665921500148L; diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini b/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini index 3b8d8c02561..720775c7a79 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini @@ -20,6 +20,9 @@ securityManager.sessionManager.globalSessionTimeout = 31536000000 cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager +subjectDAO = com.sap.sse.security.NoSessionStorageForUnauthenticatedSessionsSessionDAO +securityManager.subjectDAO = $subjectDAO + # Support for anonymous user permissions webSubjectFactoryWithAnonymousPrincipalSupport=com.sap.sse.security.WebSubjectFactoryWithAnonymousPrincipalSupport securityManager.subjectFactory=$webSubjectFactoryWithAnonymousPrincipalSupport diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html index ff2b228393d..c2d29440fa0 100755 --- a/java/com.sap.sailing.www/release_notes_admin.html +++ b/java/com.sap.sailing.www/release_notes_admin.html @@ -29,6 +29,12 @@ The new end points support resolving, creation and deletion of user groups, as well as adding and removing users and roles to and from user groups.
  • +
  • The Device Configurations table for the Race Manager App now updates its underlying data + properly when a configuration is edited locally. +
  • +
  • Blue flag up/down times can be cleared in the AdminConsole now
  • +
  • Users can now create media tracks if they have the permissions based on the ownership that + will result from the creation process.

May 2019

    diff --git a/java/com.sap.sse.security.ui/src/main/resources/shiro.ini b/java/com.sap.sse.security.ui/src/main/resources/shiro.ini index c8a642a8bc8..0f7c7179b4c 100755 --- a/java/com.sap.sse.security.ui/src/main/resources/shiro.ini +++ b/java/com.sap.sse.security.ui/src/main/resources/shiro.ini @@ -22,6 +22,9 @@ securityManager.sessionManager.globalSessionTimeout = 31536000000 cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager +subjectDAO = com.sap.sse.security.NoSessionStorageForUnauthenticatedSessionsSessionDAO +securityManager.subjectDAO = $subjectDAO + # Support for anonymous user permissions webSubjectFactoryWithAnonymousPrincipalSupport=com.sap.sse.security.WebSubjectFactoryWithAnonymousPrincipalSupport securityManager.subjectFactory=$webSubjectFactoryWithAnonymousPrincipalSupport diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java index 3697f7bc067..7019a890f83 100755 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java @@ -89,7 +89,6 @@ public class AccessControlStoreImpl implements AccessControlStore { @Override public void loadACLsAndOwnerships() { LockUtil.executeWithWriteLock(lockForManagementMappings, new Runnable() { - @Override public void run() { if (domainObjectFactory != null) { @@ -97,7 +96,7 @@ public class AccessControlStoreImpl implements AccessControlStore { internalAddACL(acl); } for (OwnershipAnnotation ownership : domainObjectFactory.loadAllOwnerships(userStore)) { - internalSetOwnershipAndmapUserAndUserGroupToOwnership(ownership); + internalSetOwnershipAndMapUserAndUserGroupToOwnership(ownership); } } } @@ -294,13 +293,12 @@ public class AccessControlStoreImpl implements AccessControlStore { final OwnershipAnnotation ownership = new OwnershipAnnotation(new Ownership(userOwnerName, tenantOwner), id, displayNameOfOwnedObject); LockUtil.executeWithWriteLock(lockForManagementMappings, new Runnable() { - @Override public void run() { // first removing it, prevents the necessity to do a delta update removeUserAndUserGroupToOwnershipMapping(ownership); // and add it to the new ownership - internalSetOwnershipAndmapUserAndUserGroupToOwnership(ownership); + internalSetOwnershipAndMapUserAndUserGroupToOwnership(ownership); } }); // and that it is finally written @@ -308,7 +306,7 @@ public class AccessControlStoreImpl implements AccessControlStore { return ownership; } - private void internalSetOwnershipAndmapUserAndUserGroupToOwnership(final OwnershipAnnotation ownership) { + private void internalSetOwnershipAndMapUserAndUserGroupToOwnership(final OwnershipAnnotation ownership) { ownerships.put(ownership.getIdOfAnnotatedObject(), ownership); UserGroup tenantOwner = ownership.getAnnotation().getTenantOwner(); if (tenantOwner != null) { @@ -413,7 +411,6 @@ public class AccessControlStoreImpl implements AccessControlStore { @Override public void replaceContentsFrom(final AccessControlStore newAccessControlStore) { LockUtil.executeWithWriteLock(lockForManagementMappings, new Runnable() { - @Override public void run() { clear(); @@ -421,7 +418,7 @@ public class AccessControlStoreImpl implements AccessControlStore { internalAddACL(acl); } for (OwnershipAnnotation ownership : newAccessControlStore.getOwnerships()) { - ownerships.put(ownership.getIdOfAnnotatedObject(), ownership); + internalSetOwnershipAndMapUserAndUserGroupToOwnership(ownership); } } }); diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/BearerTokenOrBasicOrFormAuthenticationFilter.java b/java/com.sap.sse.security/src/com/sap/sse/security/BearerTokenOrBasicOrFormAuthenticationFilter.java index e7c634c333e..b46730fe3d9 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/BearerTokenOrBasicOrFormAuthenticationFilter.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/BearerTokenOrBasicOrFormAuthenticationFilter.java @@ -28,7 +28,6 @@ import com.sap.sse.security.jaxrs.api.SecurityResource; * */ public class BearerTokenOrBasicOrFormAuthenticationFilter extends BasicHttpAuthenticationFilter { - private static final String BEARER = "Bearer"; /** diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/NoSessionStorageForUnauthenticatedSessionsSessionDAO.java b/java/com.sap.sse.security/src/com/sap/sse/security/NoSessionStorageForUnauthenticatedSessionsSessionDAO.java new file mode 100755 index 00000000000..901b9a43bb8 --- /dev/null +++ b/java/com.sap.sse.security/src/com/sap/sse/security/NoSessionStorageForUnauthenticatedSessionsSessionDAO.java @@ -0,0 +1,25 @@ +package com.sap.sse.security; + +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.mgt.SubjectDAO; +import org.apache.shiro.subject.Subject; + +/** + * A special {@link SubjectDAO} implementation that refuses to create/store a session for a subject that is not + * authenticated. In {@code shiro.ini} configure like this: + * + *
    + * 
    + *   subjectDAO = com.sap.sse.security.NoSessionStorageForUnauthenticatedSessionsSessionDAO
    + *   securityManager.subjectDAO = $subjectDAO
    + * 
    + * + * @author Axel Uhl (D043530) + * + */ +public class NoSessionStorageForUnauthenticatedSessionsSessionDAO extends DefaultSubjectDAO { + @Override + protected boolean isSessionStorageEnabled(Subject subject) { + return subject.isAuthenticated(); + } +} diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index 3689302fd4b..3ada13aefaf 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -1182,7 +1182,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat store.removeAllQualifiedRolesForUser(userToDelete); final String defaultTenantNameForUsername = getDefaultTenantNameForUsername(username); - UserGroup defaultTenantUserGroup = getUserGroupByName(defaultTenantNameForUsername); + final UserGroup defaultTenantUserGroup = getUserGroupByName(defaultTenantNameForUsername); if (defaultTenantUserGroup != null) { List usersInGroupList = Util.asList(defaultTenantUserGroup.getUsers()); if (usersInGroupList.size() == 1 && usersInGroupList.contains(userToDelete)) { @@ -1196,7 +1196,9 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat } // also remove from all usergroups for (UserGroup userGroup : userToDelete.getUserGroups()) { - internalRemoveUserFromUserGroup(userGroup.getId(), userToDelete.getName()); + if (userGroup != defaultTenantUserGroup) { // the defaultTenantUserGroup has already been deleted above + internalRemoveUserFromUserGroup(userGroup.getId(), userToDelete.getName()); + } } store.deleteUser(username); } @@ -2024,6 +2026,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat @Override public void initiallyFillFromInternal(ObjectInputStream is) throws IOException, ClassNotFoundException, InterruptedException { + logger.info("Reading cache manager..."); ReplicatingCacheManager newCacheManager = (ReplicatingCacheManager) is.readObject(); cacheManager.replaceContentsFrom(newCacheManager); // overriding thread context class loader because the user store may be provided by a different bundle; @@ -2032,6 +2035,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat if (store != null) { Thread.currentThread().setContextClassLoader(store.getClass().getClassLoader()); } + logger.info("Reading user store..."); try { UserStore newUserStore = (UserStore) is.readObject(); store.replaceContentsFrom(newUserStore); @@ -2041,12 +2045,14 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat if (accessControlStore != null) { Thread.currentThread().setContextClassLoader(accessControlStore.getClass().getClassLoader()); } + logger.info("Reading access control store..."); try { AccessControlStore newAccessControlStore = (AccessControlStore) is.readObject(); accessControlStore.replaceContentsFrom(newAccessControlStore); } finally { Thread.currentThread().setContextClassLoader(oldCCL); } + logger.info("Done filling SecurityService"); } @Override diff --git a/java/com.tractrac.clientmodule/src/com/tractrac/osgi/Activator.java b/java/com.tractrac.clientmodule/src/com/tractrac/osgi/Activator.java index 961b49ee515..17c2f156fd7 100755 --- a/java/com.tractrac.clientmodule/src/com/tractrac/osgi/Activator.java +++ b/java/com.tractrac.clientmodule/src/com/tractrac/osgi/Activator.java @@ -14,6 +14,7 @@ import com.tractrac.model.lib.impl.attachment.DefaultAttachmentManager; import com.tractrac.model.lib.impl.data.DefaultPositionFactory; import com.tractrac.model.lib.impl.event.EventFactory; import com.tractrac.model.lib.impl.metadata.DefaultMetadataFactory; +import com.tractrac.model.lib.impl.route.PathRouteFactory; import com.tractrac.subscription.lib.api.SubscriptionLocator; import com.tractrac.subscription.lib.impl.SubscriberFactory; import com.tractrac.util.lib.api.UtilLocator; @@ -33,6 +34,7 @@ public class Activator implements BundleActivator { DataflowProviderLocator.registerStoredDataProviderFactory(new MTBStoredDataProviderFactory()); ModelLocator.registerAttachmentManager(new DefaultAttachmentManager()); ModelLocator.registerEventFactory(new EventFactory()); + ModelLocator.registerPathRouteFactory(new PathRouteFactory()); ModelLocator.registerPositionFactory(new DefaultPositionFactory()); ModelLocator.registerMetadataFactory(new DefaultMetadataFactory()); SubscriptionLocator.registerSubscriberFactory(new SubscriberFactory()); diff --git a/mobile/com.sap.sailing.android.shared/res/layout/edit_set_preference.xml b/mobile/com.sap.sailing.android.shared/res/layout/edit_set_preference.xml index a54c94781e0..f8b594bf7bd 100644 --- a/mobile/com.sap.sailing.android.shared/res/layout/edit_set_preference.xml +++ b/mobile/com.sap.sailing.android.shared/res/layout/edit_set_preference.xml @@ -17,7 +17,7 @@ android:layout_weight="1" android:completionThreshold="1" android:hint="@string/enter_new_item" - android:inputType="textNoSuggestions|textVisiblePassword" /> + android:inputType="textCapWords|textNoSuggestions" />