catch up with branch daily

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
index b18683d..57f9e3f 100644
--- a/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
 Bundle-Vendor: Eclipse OSBP
 Bundle-Version: 0.9.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Require-Bundle: mondrian.osgi;bundle-version="[3.5.0,3.5.1)",
+Require-Bundle: mondrian.osgi;bundle-version="[3.5.0,4.0.0)",
  olap4j.osgi;bundle-version="[1.1.0,1.3.0)",
  org.jsoup;bundle-version="1.8.1",
  org.eclipse.core.runtime,
@@ -32,6 +32,7 @@
  org.eclipse.osbp.preferences;version="0.9.0",
  org.eclipse.osbp.runtime.common.i18n;version="0.9.0",
  org.eclipse.osbp.ui.api.datamart;version="0.9.0",
+ org.eclipse.osbp.ui.api.date;version="0.9.0",
  org.eclipse.osbp.ui.api.layout;version="0.9.0",
  org.eclipse.osbp.ui.api.metadata;version="0.9.0",
  org.eclipse.osbp.ui.api.themes;version="0.9.0",
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java
index e980d3d..d8fe54a 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java
@@ -26,7 +26,7 @@
 @SuppressWarnings("all")
 public abstract class ACubeDatamart extends ADatamart<RolapConnection> {
 
-	public abstract DerivedCellSet getResults(final Class operativeDtoClass, final List<IDto> operativeDtos);
+	public abstract DerivedCellSet getResults();
 	@Override
 	public final Map<Integer, ArrayList<String>> getAxisMap() {
 		return null;
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java
index 71db7f4..86a91f9 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java
@@ -27,6 +27,7 @@
 import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
 import org.eclipse.osbp.ui.api.datamart.DatamartFilter.FilterType;
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
+import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
 
 /**
  * The Class ADatamart.
@@ -123,6 +124,16 @@
     	return filter.getSql();
     }
     
+     /**
+     * Calls the vendor specific 'to date' sql method.
+     *
+     * @param date the date
+     * @return the vendor 'to date' sql method prefix
+     */
+    protected String vendorConvertToDateSQL( java.util.Date date ) {
+    	return vendorConvertToDateSQL(new Date(date.getTime()));
+    }
+    
     /**
      * Calls the vendor specific 'to date' sql method.
      *
@@ -135,7 +146,7 @@
     	}
     	return "to_date('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')";
     }
-
+    
     /**
      * Gets the vendor specific 'to date' sql method prefix.
      *
@@ -232,7 +243,15 @@
 				case BETWEEN_DATE:
 					if(filter.getBetweenInputComponent() != null) {
 						if ((!filter.getBetweenInputComponent().getFrom().isEmpty()) && (!filter.getBetweenInputComponent().getUntil().isEmpty())){
-							filter.setCondition(filter.getName() + " BETWEEN '" + filter.getBetweenInputComponent().getFrom() + "' AND '" + filter.getBetweenInputComponent().getUntil() + "'");
+								
+							if (filter.getBetweenInputComponent() instanceof DatamartBetweenDate) {
+								String betweenFrom = vendorConvertToDateSQL(((DatamartBetweenDate)filter.getBetweenInputComponent()).getFromInput().getValue());
+								String betweenUntil = vendorConvertToDateSQL(((DatamartBetweenDate)filter.getBetweenInputComponent()).getUntilInput().getValue());
+								filter.setCondition(filter.getName() + " BETWEEN " + betweenFrom + " AND " + betweenUntil);
+							} else {
+								filter.setCondition(filter.getName() + " BETWEEN '" + filter.getBetweenInputComponent().getFrom() + "' AND '" + filter.getBetweenInputComponent().getUntil() + "'");
+							}
+							
 						} else {
 							filter.setCondition("1=1");
 						}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java
index 4c90dbc..d6da6e0 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java
@@ -25,5 +25,6 @@
 
 @SuppressWarnings("all")
 public abstract class AEntityDatamart extends ADatamart<Connection> {
-	public abstract DerivedCellSet getResults(Class operativeDtoClass, List<IDto> operativeDtos);
+	public abstract DerivedCellSet getResults();
+	public abstract DerivedCellSet getResults(boolean limited, Class operativeDtoClass, List<IDto> operativeDtos);
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java
index 631494f..8a741bc 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java
@@ -112,7 +112,9 @@
 	 */
 	@Override
 	public void addFilterChangeListener(FilterChangeListener listener) {
-		listeners.add(listener);
+		if(!listeners.contains(listener)) {
+			listeners.add(listener);
+		}
 	}
 	
 	/* (non-Javadoc)
@@ -120,7 +122,9 @@
 	 */
 	@Override
 	public void removeFilterChangeListener(FilterChangeListener listener) {
-		listeners.remove(listener);
+		if(listeners.contains(listener)) {
+			listeners.remove(listener);
+		}
 	}
 
 	/* (non-Javadoc)
@@ -157,18 +161,16 @@
 			case BY_ID:
 				if(byId && event.getData().containsKey(EventDispatcherDataTag.ID)) {
 					Object id = event.getData().get(EventDispatcherDataTag.ID);
-					filter.setSql("");
-					if(event.getTopic().endsWith(filter.getName())) {
+					if(event.getTopic().endsWith(filter.getShortName())) {
 						if(id instanceof Integer) {
 							filter.setSql(((Integer)id).toString());
 						} else if (id instanceof String) {
 							filter.setSql("'"+(String)id+"'");
+						} else {
+							filter.setSql("");
 						}
-						
-					} else {
-						filter.setSql("");
+						mustRefresh = true;
 					}
-					mustRefresh = true;
 				}
 				break;
 			case SINGLE:
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java
index 4ac74f6..4b1f134 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java
@@ -26,6 +26,7 @@
 import java.sql.NClob;
 import java.sql.Ref;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.RowId;
 import java.sql.SQLException;
 import java.sql.SQLWarning;
@@ -47,6 +48,8 @@
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
 import org.eclipse.osbp.ui.api.datamart.IDataMart.AttributeVisibility;
 import org.eclipse.osbp.ui.api.datamart.IDataMart.EType;
+import org.eclipse.osbp.ui.api.date.SimpleDateFormatter;
+import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Action;
 import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Group;
 import org.eclipse.osbp.ui.api.useraccess.IUserAccessService;
@@ -115,7 +118,7 @@
 	
 	private OperativeDtoContainer operativeDtoContainer = null;
 	private IUserAccessService userAccessService;
-
+	private long numRowsFetched = 0L;
 	private Map<String, Boolean> columnIsVisible = new HashMap<>();
 	
 	public SqlCellSet(List<BPMTaskSummary> tasks, Map<Integer,ArrayList<String>> axisMap) {
@@ -149,7 +152,7 @@
 			SqlCellSetAxis sqlCellSetAxis = new SqlCellSetAxis(this, 1);
 			sqlAxes.add(sqlCellSetAxis);
 		}
-		
+		numRowsFetched = 0;
 		if	(numColumns > 0) {
 			int rowNo = 0;
 			for(BPMTaskSummary task : tasks) {
@@ -193,6 +196,7 @@
 				}
 		    	fCells.add(row);
 		    	rowNo++;
+		    	numRowsFetched ++;
 			}
 			for(SqlCellSetAxis axis : sqlAxes) {
 				fAxes.add(axis);
@@ -279,7 +283,7 @@
 		return null;
 	}
 
-	public SqlCellSet(ResultSet rs, Map<Integer,ArrayList<String>> axisMap, Map<String, EType> idMap,  Map<String, String> aliasMap,  Map<String, IDataMart.AttributeVisibility> hiddenMap, DatamartDtoMapper datamartDtoMapper, Class<?> operativeDtoClass, List<IDto> operativeDtos, List<DatamartPrimary<?>> primaryKeys, IUserAccessService pUserAccessService) { //NOSONAR
+	public SqlCellSet(ResultSet rs, ResultSetMetaData metaData, IUser user, Map<String, String> resultAttributes, Map<Integer,ArrayList<String>> axisMap, Map<String, EType> idMap,  Map<String, String> aliasMap,  Map<String, IDataMart.AttributeVisibility> hiddenMap, DatamartDtoMapper datamartDtoMapper, Class<?> operativeDtoClass, List<IDto> operativeDtos, List<DatamartPrimary<?>> primaryKeys, IUserAccessService pUserAccessService) { //NOSONAR
 		fCells = new ArrayList<>();
 		fAxes = new ArrayList<>();
 		sqlAxes = new ArrayList<>();
@@ -294,7 +298,7 @@
 		SqlCellSetAxis sqlCellSetAxis = null;
 		try {
 			if(!rs.isClosed()) {
-				numColumns = rs.getMetaData().getColumnCount();
+				numColumns = metaData.getColumnCount();
 			}
 		} catch (SQLException e) {
 			LOGGER.error(e.getLocalizedMessage());
@@ -310,7 +314,7 @@
 							for (String columnLabel : axisMap.get(0)) {
 								try {
 									int columnIdx = rs.findColumn(columnLabel);
-									sqlCellSetAxis.addPosition(axisNumber, ordinal, convertToMemberType(rs, columnIdx), rs.getMetaData().getColumnName(columnIdx), rs.getMetaData().getColumnLabel(columnIdx));
+									sqlCellSetAxis.addPosition(axisNumber, ordinal, convertToMemberType(rs, metaData, columnIdx), metaData.getColumnName(columnIdx), metaData.getColumnLabel(columnIdx));
 									ordinal ++;
 								} catch (SQLException e) {}
 							}
@@ -321,7 +325,7 @@
 				else {
 					sqlCellSetAxis = new SqlCellSetAxis(this, 0);
 					for (int idx=1; idx<=numColumns; idx++) {
-						sqlCellSetAxis.addPosition(0, idx-1, convertToMemberType(rs, idx), rs.getMetaData().getColumnName(idx), rs.getMetaData().getColumnLabel(idx));
+						sqlCellSetAxis.addPosition(0, idx-1, convertToMemberType(rs, metaData, idx), metaData.getColumnName(idx), metaData.getColumnLabel(idx));
 					}
 					sqlAxes.add(sqlCellSetAxis);
 				}
@@ -335,19 +339,22 @@
 			sqlCellSetAxis = new SqlCellSetAxis(this, 1);
 			sqlAxes.add(sqlCellSetAxis);
 		}
-		
+		numRowsFetched = 0;
 		if	(numColumns > 0) {
 			try {
 				if(!rs.isClosed()) {
 					int targetRowNo = 0;
 					while (rs.next()) {
+						if(resultAttributes.isEmpty()) {
+							registerFirstLine(rs, metaData, user, resultAttributes);
+						}
 						if	(operativeDtoContainer == null) {
 							operativeDtoContainer = new OperativeDtoContainer(datamartDtoMapper, operativeDtoClass, operativeDtos);
 						}
 						boolean displayRow = true;
 						if	(operativeDtoContainer.getOperativeDtoIdColumn() != null) {
 							int columnIdx = rs.findColumn(operativeDtoContainer.getOperativeDtoIdColumn());
-				    		Object value = getCastedValue(rs, columnIdx);
+				    		Object value = getCastedValue(rs, metaData, columnIdx);
 				    		displayRow = (operativeDtoContainer.getOperativeDtoForId(value) != null);
 						}
 						if	(displayRow) {
@@ -355,7 +362,7 @@
 			    			if (axisMap.keySet().size() > 1) {
 			    				int numCols = 0;
 						    	for (int idx=1; idx<=numColumns; idx++) {
-						    		String columnName = rs.getMetaData().getColumnName(idx).toLowerCase();
+						    		String columnName = metaData.getColumnName(idx).toLowerCase();
 						    		if (!axisMap.get(1).contains(columnName)) {
 						    			numCols ++;
 						    		}
@@ -377,15 +384,15 @@
 											formattedValue = "";
 											value = null;
 											if (isColumnVisible(aliasMap, hiddenMap, columnLabel )) {
-												formattedValue = getFormattedValue(rs, columnIdx);
-												value = getCastedValue(rs, columnIdx);
+												formattedValue = getFormattedValue(rs, metaData, columnIdx);
+												value = getCastedValue(rs, metaData, columnIdx);
 											}
 											
 											if(primaryMap.containsKey(columnLabel)) {
 												primaryMap.get(columnLabel).add(value);
 											}
 						    				if (axisMap.keySet().size() > 1 && axisMap.get(1).contains(columnLabel)) {
-						    					sqlAxes.get(1).addPosition(1, targetRowNo, convertToMemberType(rs, columnIdx), formattedValue, columnLabel);
+						    					sqlAxes.get(1).addPosition(1, targetRowNo, convertToMemberType(rs, metaData, columnIdx), formattedValue, columnLabel);
 						    				}
 						    				else {
 									    		row[ordinal] = new SqlCell(this, targetRowNo, ordinal, value, formattedValue, isId(columnLabel, idMap), getType(idMap));
@@ -397,13 +404,13 @@
 			    			}
 							else {
 						    	for (int columnIdx=1; columnIdx<=numColumns; columnIdx++) {
-						    		String columnLabel = rs.getMetaData().getColumnLabel(columnIdx);
+						    		String columnLabel = metaData.getColumnLabel(columnIdx);
 									formattedValue = "";
 									value = null;
 									if (isColumnVisible(aliasMap, hiddenMap, columnLabel)){
 										
-										formattedValue = getFormattedValue(rs, columnIdx);
-										value = getCastedValue(rs, columnIdx);
+										formattedValue = getFormattedValue(rs, metaData, columnIdx);
+										value = getCastedValue(rs, metaData, columnIdx);
 									}
 									if(primaryMap.containsKey(columnLabel)) {
 										primaryMap.get(columnLabel).add(value);
@@ -417,6 +424,7 @@
 							}
 					    	fCells.add(row);
 					    	targetRowNo++;
+					    	numRowsFetched ++;
 						}
 					}
 				}
@@ -457,12 +465,12 @@
 		return retColumnIsVisible;
 	}
 
-	private MemberType convertToMemberType(ResultSet rs, int idx) {
+	private MemberType convertToMemberType(ResultSet rs, ResultSetMetaData metaData, int idx) {
 		int type;
 		int scale;
 		try {
-			type = rs.getMetaData().getColumnType(idx);
-			scale = rs.getMetaData().getScale(idx);
+			type = metaData.getColumnType(idx);
+			scale = metaData.getScale(idx);
 		} catch (SQLException e) {
 			return null;
 		}
@@ -505,9 +513,9 @@
 		return operativeDtoContainer;
 	}
 
-	private Object getCastedValue(ResultSet rs, int idx) throws SQLException {
-		int type = rs.getMetaData().getColumnType(idx);
-		int scale = rs.getMetaData().getScale(idx);
+	private Object getCastedValue(ResultSet rs, ResultSetMetaData metaData, int idx) throws SQLException {
+		int type = metaData.getColumnType(idx);
+		int scale = metaData.getScale(idx);
 		
 		switch (type) {
 		case java.sql.Types.DATE:
@@ -560,8 +568,8 @@
 		return null;
 	}
 	
-	private String getFormattedValue(ResultSet rs, int idx) throws SQLException {
-		int type = rs.getMetaData().getColumnType(idx);
+	private String getFormattedValue(ResultSet rs, ResultSetMetaData metaData, int idx) throws SQLException {
+		int type = metaData.getColumnType(idx);
 		String formattedValue = "";
 		switch (type) {
     		case java.sql.Types.DATE:
@@ -1899,4 +1907,56 @@
 		return null;
 	}
 
+	public void registerFirstLine(ResultSet rs, ResultSetMetaData metaData, IUser user, Map<String, String> resultAttributes) throws SQLException {
+		for (int column = 1; column <= metaData.getColumnCount(); column++) {
+			int type = metaData.getColumnType(column);
+			switch (type) {
+			case java.sql.Types.DATE:
+				if (rs.getDate(column) != null) {
+					if (user == null) {
+						resultAttributes.put(metaData.getColumnName(column), rs.getDate(column).toString());
+					} else {
+						resultAttributes.put(metaData.getColumnName(column), SimpleDateFormatter
+								.getFormat("LONGDATE", user.getLocale()).format(rs.getDate(column)));
+					}
+				}
+				break;
+			case java.sql.Types.TIMESTAMP:
+				if (rs.getTimestamp(column) != null) {
+					if (user == null) {
+						resultAttributes.put(metaData.getColumnName(column),
+								rs.getTimestamp(column).toString());
+					} else {
+						resultAttributes.put(metaData.getColumnName(column), SimpleDateFormatter
+								.getFormat("LONGDATE", user.getLocale()).format(rs.getTimestamp(column)));
+					}
+				}
+				break;
+			case java.sql.Types.DECIMAL:
+				if (rs.getBigDecimal(column) != null) {
+					resultAttributes.put(metaData.getColumnName(column),
+							rs.getBigDecimal(column).toPlainString());
+				}
+				break;
+			case java.sql.Types.NUMERIC:
+			case java.sql.Types.DOUBLE:
+				resultAttributes.put(metaData.getColumnName(column), Double.toString(rs.getDouble(column)));
+				break;
+			case java.sql.Types.FLOAT:
+				resultAttributes.put(metaData.getColumnName(column), Float.toString(rs.getFloat(column)));
+				break;
+			case java.sql.Types.CHAR:
+			case java.sql.Types.NCHAR:
+			case java.sql.Types.NVARCHAR:
+			case java.sql.Types.VARCHAR:
+			case java.sql.Types.LONGVARCHAR:
+				resultAttributes.put(metaData.getColumnName(column), rs.getString(column));
+				break;
+			}
+		}
+	}
+	
+	public long getFetchedRows() {
+		return numRowsFetched;
+	}
 }