attempt to fix infrequent GWT serialization errors by using the

implementation classes instead of the interfaces of the
StoredDataMiningQueryDTO and StatisticQueryDefinitionDTO within the GWT
serialization process
This commit is contained in:
Steffen Jacobs
2018-12-02 13:51:21 +01:00
committed by Axel Uhl
parent 46f592a43f
commit 09398b99e2
10 changed files with 61 additions and 48 deletions
@@ -29,6 +29,7 @@ import com.sap.sailing.gwt.ui.shared.settings.SailingSettingsConstants;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.UUIDDataMiningSession;
import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO;
import com.sap.sse.datamining.ui.client.AnchorDataMiningSettingsControl;
import com.sap.sse.datamining.ui.client.CompositeResultsPresenter;
import com.sap.sse.datamining.ui.client.DataMiningService;
@@ -130,10 +131,10 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
if (queryIdentifier.equals(json.get("uuid").isString().stringValue())) {
String serializedQuery = json.get("payload").isString().stringValue();
dataMiningService.getDeserializedQuery(serializedQuery,
new AsyncCallback<StatisticQueryDefinitionDTO>() {
new AsyncCallback<ModifiableStatisticQueryDefinitionDTO>() {
@Override
public void onSuccess(StatisticQueryDefinitionDTO result) {
public void onSuccess(ModifiableStatisticQueryDefinitionDTO result) {
queryDefinitionProvider.applyQueryDefinition(result);
queryRunner.run(result);
}
@@ -65,14 +65,15 @@ public class StoredDataMiningQueryDataProvider {
update = false;
}
dataMiningService.updateOrCreateStoredQuery(storedQuery, new AsyncCallback<StoredDataMiningQueryDTO>() {
dataMiningService.updateOrCreateStoredQuery((StoredDataMiningQueryDTOImpl) storedQuery,
new AsyncCallback<StoredDataMiningQueryDTOImpl>() {
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage(), caught);
}
@Override
public void onSuccess(StoredDataMiningQueryDTO result) {
public void onSuccess(StoredDataMiningQueryDTOImpl result) {
queryDefinitions.remove(result);
queryDefinitions.add(result);
updateUi();
@@ -90,7 +91,8 @@ public class StoredDataMiningQueryDataProvider {
public boolean removeQuery(String name) {
Optional<StoredDataMiningQueryDTO> query = findByName(name);
if (query.isPresent()) {
dataMiningService.removeStoredQuery(query.get(), new AsyncCallback<StoredDataMiningQueryDTO>() {
dataMiningService.removeStoredQuery((StoredDataMiningQueryDTOImpl) query.get(),
new AsyncCallback<StoredDataMiningQueryDTOImpl>() {
@Override
public void onFailure(Throwable caught) {
@@ -98,7 +100,7 @@ public class StoredDataMiningQueryDataProvider {
}
@Override
public void onSuccess(StoredDataMiningQueryDTO result) {
public void onSuccess(StoredDataMiningQueryDTOImpl result) {
queryDefinitions.remove(result);
updateUi();
}
@@ -141,9 +143,9 @@ public class StoredDataMiningQueryDataProvider {
/** Refresh the stored queries and update the {@link StoredDataMiningQueryPanel}. */
private void refreshQueries() {
dataMiningService.retrieveStoredQueries(new AsyncCallback<ArrayList<StoredDataMiningQueryDTO>>() {
dataMiningService.retrieveStoredQueries(new AsyncCallback<ArrayList<StoredDataMiningQueryDTOImpl>>() {
@Override
public void onSuccess(ArrayList<StoredDataMiningQueryDTO> result) {
public void onSuccess(ArrayList<StoredDataMiningQueryDTOImpl> result) {
queryDefinitions.addAll(result);
updateUi();
}
@@ -40,8 +40,6 @@ import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.SerializationDummy;
import com.sap.sse.datamining.shared.data.QueryResultState;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.dto.StoredDataMiningQueryDTO;
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier;
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
@@ -354,7 +352,7 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
@Override
public <ResultType extends Serializable> QueryResultDTO<ResultType> runQuery(DataMiningSession session,
StatisticQueryDefinitionDTO queryDefinitionDTO) {
ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ,
queryDefinitionDTO.getDataRetrieverChainDefinition().getName()));
DataMiningServer dataMiningServer = getDataMiningServer();
@@ -376,10 +374,12 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
}
@Override
public StatisticQueryDefinitionDTO getPredefinedQueryDefinition(PredefinedQueryIdentifier identifier, String localeInfoName) {
public ModifiableStatisticQueryDefinitionDTO getPredefinedQueryDefinition(PredefinedQueryIdentifier identifier,
String localeInfoName) {
SecurityUtils.getSubject().checkPermission(
Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ, identifier.getIdentifier()));
return localize(getDataMiningServer().getPredefinedQueryDefinitionDTO(identifier), localeInfoName);
return (ModifiableStatisticQueryDefinitionDTO) localize(
getDataMiningServer().getPredefinedQueryDefinitionDTO(identifier), localeInfoName);
}
@Override
@@ -398,13 +398,15 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
}
@Override
public StatisticQueryDefinitionDTO localize(StatisticQueryDefinitionDTO queryDefinitionDTO, String localeInfoName) {
public ModifiableStatisticQueryDefinitionDTO localize(ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO,
String localeInfoName) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ,
queryDefinitionDTO.getDataRetrieverChainDefinition().getName()));
DataMiningServer dataMiningServer = getDataMiningServer();
StatisticQueryDefinition<?, ?, ?, ?> queryDefinition = dataMiningServer.getQueryDefinitionForDTO(queryDefinitionDTO);
Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
return dtoFactory.createQueryDefinitionDTO(queryDefinition, dataMiningServer.getStringMessages(), locale, localeInfoName);
return (ModifiableStatisticQueryDefinitionDTO) dtoFactory.createQueryDefinitionDTO(queryDefinition,
dataMiningServer.getStringMessages(), locale, localeInfoName);
}
@Override
@@ -413,26 +415,26 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
}
@Override
public ArrayList<StoredDataMiningQueryDTO> retrieveStoredQueries() {
public ArrayList<StoredDataMiningQueryDTOImpl> retrieveStoredQueries() {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ));
return storedDataMiningQueryPersistor.retrieveStoredQueries();
}
@Override
public StoredDataMiningQueryDTO updateOrCreateStoredQuery(StoredDataMiningQueryDTO query) {
public StoredDataMiningQueryDTOImpl updateOrCreateStoredQuery(StoredDataMiningQueryDTOImpl query) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.UPDATE));
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.CREATE));
return storedDataMiningQueryPersistor.updateOrCreateStoredQuery(query);
return (StoredDataMiningQueryDTOImpl) storedDataMiningQueryPersistor.updateOrCreateStoredQuery(query);
}
@Override
public StoredDataMiningQueryDTO removeStoredQuery(StoredDataMiningQueryDTO query) {
public StoredDataMiningQueryDTOImpl removeStoredQuery(StoredDataMiningQueryDTOImpl query) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.CREATE));
return storedDataMiningQueryPersistor.removeStoredQuery(query);
return (StoredDataMiningQueryDTOImpl) storedDataMiningQueryPersistor.removeStoredQuery(query);
}
@Override
public StatisticQueryDefinitionDTO getDeserializedQuery(String serializedQuery) {
return DataMiningQuerySerializer.fromBase64String(serializedQuery);
public ModifiableStatisticQueryDefinitionDTO getDeserializedQuery(String serializedQuery) {
return (ModifiableStatisticQueryDefinitionDTO) DataMiningQuerySerializer.fromBase64String(serializedQuery);
}
}
@@ -3,12 +3,13 @@ package com.sap.sailing.gwt.ui.server;
import java.util.ArrayList;
import com.sap.sse.datamining.shared.dto.StoredDataMiningQueryDTO;
import com.sap.sse.datamining.shared.impl.dto.StoredDataMiningQueryDTOImpl;
/** Instances of this class can load, update, create and remove stored data mining queries from the user store. */
public interface StoredDataMiningQueryPersister {
/** @return all {@link StoredDataMiningQueryDTO}s the user has stored in his user store. */
ArrayList<StoredDataMiningQueryDTO> retrieveStoredQueries();
ArrayList<StoredDataMiningQueryDTOImpl> retrieveStoredQueries();
/** Updates or creates a new stored query and returns it. */
StoredDataMiningQueryDTO updateOrCreateStoredQuery(StoredDataMiningQueryDTO query);
@@ -29,15 +29,18 @@ public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQuery
}
/** @return all {@link StoredDataMiningQueryDTO}s the user has stored in his user store. */
@SuppressWarnings("unchecked")
@Override
public ArrayList<StoredDataMiningQueryDTO> retrieveStoredQueries() {
public ArrayList<StoredDataMiningQueryDTOImpl> retrieveStoredQueries() {
StoredDataMiningQueryPreferences prefs = getPreferenceForCurrentUser(
SailingPreferences.STORED_DATAMINING_QUERY_PREFERENCES);
if (prefs == null) {
return new ArrayList<>();
}
return new ArrayList<>(StreamSupport.stream(prefs.getStoredQueries().spliterator(), false).map(this::transform)
return new ArrayList<StoredDataMiningQueryDTOImpl>(
(Collection<? extends StoredDataMiningQueryDTOImpl>) StreamSupport
.stream(prefs.getStoredQueries().spliterator(), false).map(this::transform)
.collect(Collectors.toList()));
}
@@ -14,7 +14,7 @@ public class StoredDataMiningQueryDTOImpl implements StoredDataMiningQueryDTO {
private UUID id;
private StatisticQueryDefinitionDTO query;
private ModifiableStatisticQueryDefinitionDTO query;
public StoredDataMiningQueryDTOImpl() {
}
@@ -22,7 +22,7 @@ public class StoredDataMiningQueryDTOImpl implements StoredDataMiningQueryDTO {
public StoredDataMiningQueryDTOImpl(String name, UUID id, StatisticQueryDefinitionDTO query) {
this.name = name;
this.id = id;
this.query = query;
this.query = (ModifiableStatisticQueryDefinitionDTO) query;
}
@Override
@@ -48,7 +48,7 @@ public class StoredDataMiningQueryDTOImpl implements StoredDataMiningQueryDTO {
}
public void setSerializedQuery(StatisticQueryDefinitionDTO query) {
this.query = query;
this.query = (ModifiableStatisticQueryDefinitionDTO) query;
}
@Override
@@ -10,8 +10,6 @@ import com.google.gwt.user.client.rpc.RemoteService;
import com.sap.sse.common.settings.SerializableSettings;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.SerializationDummy;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.dto.StoredDataMiningQueryDTO;
import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier;
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
@@ -53,24 +51,26 @@ public interface DataMiningService extends RemoteService {
String localeInfoName);
<ResultType extends Serializable> QueryResultDTO<ResultType> runQuery(DataMiningSession session,
StatisticQueryDefinitionDTO queryDefinition);
ModifiableStatisticQueryDefinitionDTO queryDefinition);
HashSet<PredefinedQueryIdentifier> getPredefinedQueryIdentifiers();
StatisticQueryDefinitionDTO getPredefinedQueryDefinition(PredefinedQueryIdentifier identifier, String localeInfoName);
ModifiableStatisticQueryDefinitionDTO getPredefinedQueryDefinition(PredefinedQueryIdentifier identifier,
String localeInfoName);
<ResultType extends Serializable> QueryResultDTO<ResultType> runPredefinedQuery(DataMiningSession session,
PredefinedQueryIdentifier identifier, String localeInfoName);
StatisticQueryDefinitionDTO localize(StatisticQueryDefinitionDTO queryDefinition, String localeInfoName);
ModifiableStatisticQueryDefinitionDTO localize(ModifiableStatisticQueryDefinitionDTO queryDefinition,
String localeInfoName);
SerializationDummy pseudoMethodSoThatSomeClassesAreAddedToTheGWTSerializationPolicy();
ArrayList<StoredDataMiningQueryDTO> retrieveStoredQueries();
ArrayList<StoredDataMiningQueryDTOImpl> retrieveStoredQueries();
StoredDataMiningQueryDTO updateOrCreateStoredQuery(StoredDataMiningQueryDTO query);
StoredDataMiningQueryDTOImpl updateOrCreateStoredQuery(StoredDataMiningQueryDTOImpl query);
StoredDataMiningQueryDTO removeStoredQuery(StoredDataMiningQueryDTO query);
StoredDataMiningQueryDTOImpl removeStoredQuery(StoredDataMiningQueryDTOImpl query);
StatisticQueryDefinitionDTO getDeserializedQuery(String serializedQuery);
ModifiableStatisticQueryDefinitionDTO getDeserializedQuery(String serializedQuery);
}
@@ -57,19 +57,19 @@ public interface DataMiningServiceAsync {
String localeInfoName, AsyncCallback<QueryResultDTO<HashSet<Object>>> callback);
<ResultType extends Serializable> void runQuery(DataMiningSession session,
StatisticQueryDefinitionDTO queryDefinition, AsyncCallback<QueryResultDTO<ResultType>> callback);
ModifiableStatisticQueryDefinitionDTO queryDefinition, AsyncCallback<QueryResultDTO<ResultType>> callback);
void getPredefinedQueryIdentifiers(AsyncCallback<HashSet<PredefinedQueryIdentifier>> callback);
void getPredefinedQueryDefinition(PredefinedQueryIdentifier identifier, String localeInfoName,
AsyncCallback<StatisticQueryDefinitionDTO> callback);
AsyncCallback<ModifiableStatisticQueryDefinitionDTO> callback);
<ResultType extends Serializable> void runPredefinedQuery(DataMiningSession session,
PredefinedQueryIdentifier identifier, String localeInfoName,
AsyncCallback<QueryResultDTO<ResultType>> callback);
void localize(StatisticQueryDefinitionDTO queryDefinition, String localeInfoName,
AsyncCallback<StatisticQueryDefinitionDTO> callback);
void localize(ModifiableStatisticQueryDefinitionDTO queryDefinition, String localeInfoName,
AsyncCallback<ModifiableStatisticQueryDefinitionDTO> callback);
/**
* This method does nothing, but is needed to ensure, that some classes for the data mining (like
@@ -79,14 +79,15 @@ public interface DataMiningServiceAsync {
void pseudoMethodSoThatSomeClassesAreAddedToTheGWTSerializationPolicy(AsyncCallback<SerializationDummy> callback);
/** Retrieves the {@link StoredDataMiningQueryDTO}s from the back end. */
void retrieveStoredQueries(AsyncCallback<ArrayList<StoredDataMiningQueryDTO>> callback);
void retrieveStoredQueries(AsyncCallback<ArrayList<StoredDataMiningQueryDTOImpl>> callback);
/** Updates or creates a {@link StoredDataMiningQueryDTO} in the back end. */
void updateOrCreateStoredQuery(StoredDataMiningQueryDTO query, AsyncCallback<StoredDataMiningQueryDTO> callback);
void updateOrCreateStoredQuery(StoredDataMiningQueryDTOImpl query,
AsyncCallback<StoredDataMiningQueryDTOImpl> callback);
/** Removes the {@link StoredDataMiningQueryDTO} if it exists from the back end. */
void removeStoredQuery(StoredDataMiningQueryDTO query, AsyncCallback<StoredDataMiningQueryDTO> callback);
void removeStoredQuery(StoredDataMiningQueryDTOImpl query, AsyncCallback<StoredDataMiningQueryDTOImpl> callback);
/** Gets the {@link StatisticQueryDefinitionDTO} from the serialized String. */
void getDeserializedQuery(String serializedQuery, AsyncCallback<StatisticQueryDefinitionDTO> callback);
void getDeserializedQuery(String serializedQuery, AsyncCallback<ModifiableStatisticQueryDefinitionDTO> callback);
}
@@ -19,6 +19,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.Util;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier;
import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO;
import com.sap.sse.datamining.ui.client.DataMiningServiceAsync;
import com.sap.sse.datamining.ui.client.QueryDefinitionProvider;
import com.sap.sse.datamining.ui.client.StringMessages;
@@ -140,9 +141,10 @@ public class PredefinedQueryRunner extends ComponentWithoutSettings {
protected void runSelectedPredefinedQuery() {
PredefinedQueryIdentifier predefinedQueryIdentifier = selectionListBox.getValue();
dataMiningService.getPredefinedQueryDefinition(predefinedQueryIdentifier,
LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<StatisticQueryDefinitionDTO>() {
LocaleInfo.getCurrentLocale().getLocaleName(),
new AsyncCallback<ModifiableStatisticQueryDefinitionDTO>() {
@Override
public void onSuccess(StatisticQueryDefinitionDTO queryDefinition) {
public void onSuccess(ModifiableStatisticQueryDefinitionDTO queryDefinition) {
queryDefinitionProvider.applyQueryDefinition(queryDefinition);
queryRunner.accept(queryDefinition);
}
@@ -11,6 +11,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.Util;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
import com.sap.sse.datamining.ui.client.AbstractDataMiningComponent;
import com.sap.sse.datamining.ui.client.CompositeResultsPresenter;
@@ -92,7 +93,7 @@ public class SimpleQueryRunner extends AbstractDataMiningComponent<QueryRunnerSe
if (errorMessages == null || !errorMessages.iterator().hasNext()) {
counter.increase();
resultsPresenter.showBusyIndicator(presenterId);
dataMiningService.runQuery(session, queryDefinition,
dataMiningService.runQuery(session, (ModifiableStatisticQueryDefinitionDTO) queryDefinition,
new ManagedDataMiningQueryCallback<Serializable>(counter) {
@Override
protected void handleSuccess(QueryResultDTO<Serializable> result) {