diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResult.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResult.java index cb2ab97c968..fcc55519ca0 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResult.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResult.java @@ -8,7 +8,7 @@ public interface QueryResult extends Serializable { int getRetrievedDataAmount(); public int getFilteredDataAmount(); public double getCalculationTimeInSeconds(); - + public boolean isEmpty(); /** * @return a description what kind of results are contained. diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResultImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResultImpl.java index 64fb8beaf1d..eee56c0741d 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResultImpl.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/QueryResultImpl.java @@ -11,8 +11,8 @@ public class QueryResultImpl implements QueryResult results; @@ -50,6 +50,11 @@ public class QueryResultImpl implements QueryResult extends Flo listeners = new HashSet>(); } - + @Override - public boolean areComponentsValid() { - return isGrouperValid() && isStatisticToCalculateValid() && isAggregatorValid(); + public Iterable validateComponents() { + Collection errorMessages = new ArrayList(); + + String grouperError = validateGrouper(); + if (grouperError != null && !grouperError.isEmpty()) { + errorMessages.add(grouperError); + } + + String statisticError = validateStatisticAndAggregator(); + if (statisticError != null && !statisticError.isEmpty()) { + errorMessages.add(statisticError); + } + + return errorMessages; } - private boolean isAggregatorValid() { - return getAggregatorType() != null; - } - - private boolean isStatisticToCalculateValid() { - return getStatisticToCalculate() != null; - } - - private boolean isGrouperValid() { - ValidateGrouper: switch (getGrouperType()) { + private String validateGrouper() { + GrouperType grouper = getGrouperType(); + if (grouper == null) { + return stringMessages.noGrouperSelectedError(); + } + + ValidateGrouper: switch (grouper) { case Custom: if (getCustomGrouperScriptText().isEmpty()) { - return false; + return stringMessages.noCustomGrouperScriptTextError(); } break; case Dimensions: @@ -52,14 +63,20 @@ public abstract class AbstractQueryComponentsProvider extends Flo break ValidateGrouper; } } - return false; + return stringMessages.noDimensionToGroupBySelectedError(); default: - return false; + return stringMessages.noGrouperSelectedError(); } - return true; + return null; } + private String validateStatisticAndAggregator() { + return getStatisticAndAggregatorType() == null ? stringMessages.noStatisticSelectedError() : null; + } + + protected abstract StatisticAndAggregatorType getStatisticAndAggregatorType(); + @Override public void addListener(QueryComponentsChangedListener listener) { listeners.add(listener); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/AbstractResultsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/AbstractResultsPanel.java index b10d568a038..f094cb62d0a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/AbstractResultsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/AbstractResultsPanel.java @@ -23,45 +23,48 @@ public abstract class AbstractResultsPanel extends Fl private QueryComponentsProvider queryComponentsProvider; private Label queryStatusLabel; - private ResultsPresentator presentator; + private ResultsPresenter presenter; private Button runQueryButton; public AbstractResultsPanel(StringMessages stringMessages, SailingServiceAsync sailingService, - ErrorReporter errorReporter, QueryComponentsProvider queryComponentsProvider, ResultsPresentator presentator) { + ErrorReporter errorReporter, QueryComponentsProvider queryComponentsProvider, ResultsPresenter presenter) { super(); this.stringMessages = stringMessages; this.sailingService = sailingService; this.errorReporter = errorReporter; this.queryComponentsProvider = queryComponentsProvider; + this.presenter = presenter; add(createFunctionsPanel()); - this.presentator = presentator; - add(this.presentator.getWidget()); + add(this.presenter.getWidget()); + runQuery(); } - + @Override public void queryComponentsChanged(QueryComponentsProvider componentsProvider) { - if (componentsProvider.areComponentsValid()) { - runQuery(); - } else { - //TODO Display error message - } + runQuery(); } private void runQuery() { - queryStatusLabel.setText(" | " + stringMessages.running()); - sendServerRequest(new AsyncCallback>() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error running the query: " + caught.getMessage()); - } - @Override - public void onSuccess(QueryResult result) { - queryStatusLabel.setText(" | " + stringMessages.done()); - presentator.showResult(result); - } - }); + Iterable errorMessages = queryComponentsProvider.validateComponents(); + if (errorMessages == null || !errorMessages.iterator().hasNext()) { + queryStatusLabel.setText(" | " + stringMessages.running()); + sendServerRequest(new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error running the query: " + caught.getMessage()); + } + + @Override + public void onSuccess(QueryResult result) { + queryStatusLabel.setText(" | " + stringMessages.done()); + presenter.showResult(result); + } + }); + } else { + presenter.showError(stringMessages.queryNotValidBecause(), errorMessages); + } } protected abstract void sendServerRequest(AsyncCallback> asyncCallback); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningPanel.java index 8d8c825b228..8924738c57e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningPanel.java @@ -12,7 +12,7 @@ public class DataMiningPanel extends FlowPanel { GPSFixQueryComponentsPanel selectionPanel = new GPSFixQueryComponentsPanel(stringMessages, sailingService, errorReporter); this.add(selectionPanel); - ResultsPresentator resultsChart = new ResultsChart(stringMessages); + ResultsPresenter resultsChart = new ResultsChart(stringMessages); GPSFixResultsPanel queryPanel = new GPSFixResultsPanel(stringMessages, sailingService, errorReporter, selectionPanel, resultsChart); this.add(queryPanel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixQueryComponentsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixQueryComponentsPanel.java index c948d1221c5..2013f28b386 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixQueryComponentsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixQueryComponentsPanel.java @@ -112,6 +112,11 @@ public class GPSFixQueryComponentsPanel extends AbstractQueryComponentsProvider< return dimensionsToGroupBy; } + @Override + protected StatisticAndAggregatorType getStatisticAndAggregatorType() { + return statisticsListBox.getValue(); + } + @Override public StatisticType getStatisticToCalculate() { return statisticsListBox.getValue().getStatisticType(); @@ -266,13 +271,15 @@ public class GPSFixQueryComponentsPanel extends AbstractQueryComponentsProvider< grouperTypeListBox.addValueChangeHandler(new ValueChangeHandler() { @Override public void onValueChange(ValueChangeEvent event) { - switch (event.getValue()) { - case Custom: - groupByOptionsPanel.showWidget(1); - break; - case Dimensions: - groupByOptionsPanel.showWidget(0); - break; + if (event.getValue() != null) { + switch (event.getValue()) { + case Custom: + groupByOptionsPanel.showWidget(1); + break; + case Dimensions: + groupByOptionsPanel.showWidget(0); + break; + } } notifyQueryComponentsChanged(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixResultsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixResultsPanel.java index 1cb25950c8a..ca52492cfbc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixResultsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GPSFixResultsPanel.java @@ -17,8 +17,8 @@ import com.sap.sailing.gwt.ui.datamining.QueryComponentsProvider.GrouperType; public class GPSFixResultsPanel extends AbstractResultsPanel { public GPSFixResultsPanel(StringMessages stringMessages, SailingServiceAsync sailingService, - ErrorReporter errorReporter, QueryComponentsProvider queryComponentsProvider, ResultsPresentator presentator) { - super(stringMessages, sailingService, errorReporter, queryComponentsProvider, presentator); + ErrorReporter errorReporter, QueryComponentsProvider queryComponentsProvider, ResultsPresenter presenter) { + super(stringMessages, sailingService, errorReporter, queryComponentsProvider, presenter); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryComponentsProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryComponentsProvider.java index ad2b7a10ea3..73b863db3f9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryComponentsProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryComponentsProvider.java @@ -10,7 +10,7 @@ public interface QueryComponentsProvider { public enum GrouperType { Dimensions, Custom } - public boolean areComponentsValid(); + public Iterable validateComponents(); public Map> getSelection(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsChart.java index 2bf00f7f598..04d57b1b388 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsChart.java @@ -20,7 +20,7 @@ import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsFormatter; import org.moxieapps.gwt.highcharts.client.labels.XAxisLabels; import org.moxieapps.gwt.highcharts.client.labels.YAxisLabels; -import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; @@ -28,7 +28,7 @@ import com.sap.sailing.datamining.shared.GroupKey; import com.sap.sailing.datamining.shared.QueryResult; import com.sap.sailing.gwt.ui.client.StringMessages; -public class ResultsChart implements ResultsPresentator, RequiresResize { +public class ResultsChart implements ResultsPresenter, RequiresResize { private StringMessages stringMessages; private SimplePanel mainPanel; @@ -39,37 +39,56 @@ public class ResultsChart implements ResultsPresentator, RequiresResize private Map mainKeyToValueMap; private Map valueToGroupKeyMap; - private Label noQuerySelectedLabel; + private HTML errorLabel; public ResultsChart(StringMessages stringMessages) { super(); this.stringMessages = stringMessages; mainPanel = new SimplePanel(); series = new HashMap(); - noQuerySelectedLabel = new Label(this.stringMessages.noQuerySelected() + "."); - noQuerySelectedLabel.setStyleName("chart-importantMessage"); + errorLabel = new HTML(); + errorLabel.setStyleName("chart-importantMessage"); createChart(); - mainPanel.setWidget(noQuerySelectedLabel); + mainPanel.setWidget(chart); + } + + @Override + public void showError(String error) { + errorLabel.setHTML(error); + mainPanel.setWidget(errorLabel); + } + + @Override + public void showError(String mainError, Iterable detailedErrors) { + StringBuilder errorBuilder = new StringBuilder(mainError + ":
    "); + for (String detailedError : detailedErrors) { + errorBuilder.append("
  • " + detailedError + "
  • "); + } + errorBuilder.append("
"); + showError(errorBuilder.toString()); } @Override public void showResult(QueryResult result) { - reset(); - - updateYAxisLabels(result); - updateChartSubtitleAndSetChartAsWidget(result); - - List sortedKeys = getSortedKeysFrom(result); - buildGroupKeyValueMaps(sortedKeys); - - if (resultHasComplexKeys(result)) { - displayComplexResult(result, sortedKeys); + if (!result.isEmpty()) { + resetChart(); + + updateYAxisLabels(result); + updateChartSubtitleAndSetChartAsWidget(result); + + List sortedKeys = getSortedKeysFrom(result); + buildGroupKeyValueMaps(sortedKeys); + if (resultHasComplexKeys(result)) { + displayComplexResult(result, sortedKeys); + } else { + displaySimpleResult(result, sortedKeys); + } + + chart.redraw(); } else { - displaySimpleResult(result, sortedKeys); + showError(stringMessages.noDataFound() + "."); } - - chart.redraw(); } private void updateYAxisLabels(QueryResult result) { @@ -152,7 +171,7 @@ public class ResultsChart implements ResultsPresentator, RequiresResize return series.get(key); } - private void reset() { + private void resetChart() { chart.removeAllSeries(false); series = new HashMap(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresentator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresenter.java similarity index 59% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresentator.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresenter.java index e53d5bdf6d1..5f25d94c520 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresentator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresenter.java @@ -3,10 +3,13 @@ package com.sap.sailing.gwt.ui.datamining; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.datamining.shared.QueryResult; -public interface ResultsPresentator { +public interface ResultsPresenter { + + public Widget getWidget(); public void showResult(QueryResult result); - public Widget getWidget(); + public void showError(String error); + public void showError(String mainError, Iterable detailedErrors); }