catch up with development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index 92c6c4b..e536e25 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -17,6 +17,7 @@
         <jenkins.build.dependencies>
                 <jenkins.build.dependency>org.eclipse.osbp.bpm.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ecview.core</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.preferences</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.runtime</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency>
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 0f9a439..d727c9c 100644
--- a/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
@@ -19,7 +19,8 @@
  org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.dsl.datatype.lib;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.common,
- org.eclipse.e4.core.contexts
+ org.eclipse.e4.core.contexts,
+ org.eclipse.osbp.ecview.core.common
 Import-Package: javax.annotation,
  javax.validation,
  javax.validation.constraints,
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenDate.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenDate.java
index df87322..669e6b8 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenDate.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenDate.java
@@ -17,6 +17,13 @@
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Locale;
 
 import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
 import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
@@ -27,21 +34,33 @@
 import com.vaadin.data.Property.ValueChangeListener;
 import com.vaadin.data.util.converter.Converter.ConversionException;
 import com.vaadin.shared.ui.datefield.Resolution;
+import com.vaadin.ui.ComboBox;
 import com.vaadin.ui.DateField;
 import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.UI;
 
 public class DatamartBetweenDate extends HorizontalLayout implements IDatamartBetweenInput {
 
 	private static Logger LOGGER = org.slf4j.LoggerFactory.getLogger(DatamartBetweenDate.class.getName());
 
+	private static final long serialVersionUID = -5673052113801450589L;
+
 	private DateField fromInput;
 
 	private DateField untilInput;
 
-	private static final long serialVersionUID = -5673052113801450589L;
+	private ComboBox defaultDatesCombo;
+	
+	private boolean defaultDateUpdateFlagFrom = false;
+	private boolean defaultDateUpdateFlagUntil = false;
+
+	private enum DefaultTime {
+		MANUALLY, TODAY, YESTERDAY, THIS_WEEK, LAST_WEEK, THIS_MONTH
+	}
+	
 
 	// private DateFormat formatter = DateFormat.getDateTimeInstance();
-	private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+	private SimpleDateFormat formatter = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, UI.getCurrent().getLocale());
 
 	public static long getSerialversionuid() {
 		return serialVersionUID;
@@ -50,19 +69,21 @@
 	public DatamartBetweenDate() {
 		fromInput = new DateField();
 		untilInput = new DateField();
-		fromInput.setDateFormat("yyyy-MM-dd HH:mm:ss");
-		untilInput.setDateFormat("yyyy-MM-dd HH:mm:ss");
+		fromInput.setDateFormat(formatter.toPattern());
+		untilInput.setDateFormat(formatter.toPattern());
 		fromInput.setResolution(Resolution.SECOND);
 		untilInput.setResolution(Resolution.SECOND);
+		createDefaultDatesCombo();
 		addComponent(fromInput);
 		addComponent(untilInput);
+		addComponent(defaultDatesCombo);
 		addStyleName(EnumCssClass.RANGE_SELECTION.styleName());
 	}
 
 	public DatamartBetweenDate(DatamartFilter.DateTimeFormat filterFormat, DatamartFilter.DateResolution filterResolution) {
 		fromInput = new DateField();
 		untilInput = new DateField();
-		String dateFormat = "yyyy-MM-dd HH:mm:ss";
+		String dateFormat = formatter.toPattern();
 		Resolution resolution = Resolution.MINUTE;
 		if (filterFormat != null && filterResolution != null) {
 			dateFormat = getFormat(filterFormat, filterResolution);
@@ -72,11 +93,117 @@
 		untilInput.setDateFormat(dateFormat);
 		fromInput.setResolution(resolution);
 		untilInput.setResolution(resolution);
+		createDefaultDatesCombo();
 		addComponent(fromInput);
 		addComponent(untilInput);
+		addComponent(defaultDatesCombo);
 		addStyleName(EnumCssClass.RANGE_SELECTION.styleName());
 	}
 
+	private void createDefaultDatesCombo() {
+		defaultDatesCombo = new ComboBox();
+		defaultDatesCombo.setStyleName(EnumCssClass.DEFAULT_TIMES.styleName());
+		fromInput.addValueChangeListener(e -> {
+			fromInput.setValue((Date) e.getProperty().getValue());
+			if (!isDefaultDateUpdateFlagFrom()) {
+				defaultDatesCombo.setValue(DefaultTime.MANUALLY);
+			}
+			setDefaultDateUpdateFlagFrom(false);
+		});
+		untilInput.addValueChangeListener(e -> {
+			untilInput.setValue((Date) e.getProperty().getValue());
+			if (!isDefaultDateUpdateFlagUntil()) {
+				defaultDatesCombo.setValue(DefaultTime.MANUALLY);
+			}
+			setDefaultDateUpdateFlagUntil(false);
+		});
+		
+		defaultDatesCombo.addItems(Arrays.asList(DefaultTime.values()));
+		defaultDatesCombo.addValueChangeListener(e -> {
+			DefaultTime dt = (DefaultTime)e.getProperty().getValue();
+			if (!DefaultTime.MANUALLY.equals(dt)) {
+				setDefaultDateUpdateFlagFrom(true);
+				setDefaultDateUpdateFlagUntil(true);
+				fromInput.setValue(getDateFromDefaultTime(dt)[0]);
+				untilInput.setValue(getDateFromDefaultTime(dt)[1]);
+			}
+		});
+
+	}
+	
+	private Date[] getDateFromDefaultTime(DefaultTime dt){
+		Date[] dateArray = new Date[2];
+		LocalDate today = LocalDate.now();
+		switch (dt) {
+		case TODAY:
+			dateArray[0] = convertToDate(today.atTime(0, 0, 0));
+			dateArray[1] = convertToDate(today.atTime(23, 59, 59));
+			return dateArray;
+		case YESTERDAY:
+			LocalDate yesterday = today.minusDays(1);
+			dateArray[0] = convertToDate(yesterday.atTime(0, 0, 0));
+			dateArray[1] = convertToDate(yesterday.atTime(23, 59, 59));
+			return dateArray;
+		case THIS_WEEK:
+			DayOfWeek dayOfWeek = today.getDayOfWeek();
+			dateArray[0] = convertToDate(today.minusDays(dayOfWeek.getValue()-1));
+			dateArray[1] = convertToDate(today.plusDays(7-dayOfWeek.getValue()).atTime(23, 59, 59));
+			return dateArray;
+		case LAST_WEEK:
+			LocalDate lastWeekDate = today.minusWeeks(1);
+			DayOfWeek dayOfLastWeek = lastWeekDate.getDayOfWeek();
+			dateArray[0] = convertToDate(lastWeekDate.minusDays(dayOfLastWeek.getValue()-1));
+			dateArray[1] = convertToDate(lastWeekDate.plusDays(7-dayOfLastWeek.getValue()).atTime(23, 59, 59));
+			return dateArray;
+		case THIS_MONTH:
+			dateArray[0] = convertToDate(today.withDayOfMonth(1));
+			dateArray[1] = convertToDate(today.withDayOfMonth(1).plusMonths(1).minusDays(1).atTime(23, 59, 59));
+			return dateArray;
+		case MANUALLY:
+		default:
+			dateArray[0] = convertToDate(today.atTime(0, 0, 0));
+			dateArray[1] = convertToDate(today.atTime(0, 0, 0));
+			return dateArray;
+		}
+	}
+	
+	private Date convertToDate(LocalDate value) {
+
+        if (value != null) {
+            return Date.from(value.atStartOfDay()
+            	      .atZone(ZoneId.systemDefault())
+            	      .toInstant());
+        }
+
+        return null;
+    }
+
+	private Date convertToDate(LocalDateTime value) {
+		
+		if (value != null) {
+			return Date.from(value.atZone(ZoneId.systemDefault())
+					.toInstant());
+		}
+		
+		return null;
+	}
+	
+	private boolean isDefaultDateUpdateFlagFrom() {
+		return defaultDateUpdateFlagFrom;
+	}
+
+	private boolean isDefaultDateUpdateFlagUntil() {
+		return defaultDateUpdateFlagUntil;
+	}
+	
+	private void setDefaultDateUpdateFlagFrom(boolean defaultDateUpdateFlagFrom) {
+		this.defaultDateUpdateFlagFrom = defaultDateUpdateFlagFrom;
+	}
+
+	private void setDefaultDateUpdateFlagUntil(boolean defaultDateUpdateFlagUntil) {
+		this.defaultDateUpdateFlagUntil = defaultDateUpdateFlagUntil;
+	}
+	
 	private String getFormat(DatamartFilter.DateTimeFormat format, DatamartFilter.DateResolution resolution) {
 		DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);
 		String pattern  = ((SimpleDateFormat)formatter).toPattern();
@@ -279,4 +406,14 @@
 		untilInput.setDescription(description + "]");
 	}
 
+	public void setLocale(Locale locale){
+		formatter = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
+		fromInput.setDateFormat(formatter.toPattern());
+		untilInput.setDateFormat(formatter.toPattern());
+	}
+
+	public SimpleDateFormat getFormatter() {
+		return formatter;
+	}
+
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenText.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenText.java
index 628a101..6589ea5 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenText.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenText.java
@@ -14,6 +14,8 @@
  */
 package org.eclipse.osbp.xtext.datamart.common;
 
+import java.util.Locale;
+
 import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
 import org.eclipse.osbp.ui.api.themes.EnumCssClass;
 
@@ -104,6 +106,8 @@
 		untilInput.setDescription(description + "]");
 	}
 	
-
+	public void setLocale(Locale locale){
+		// Do nothing
+	}
 	
 }
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 5f582ea..0ca8249 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
@@ -14,13 +14,22 @@
  */
 package org.eclipse.osbp.xtext.datamart.common;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import javax.validation.constraints.NotNull;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
@@ -38,6 +47,10 @@
 import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.xtext.i18n.I18NKeyGenerator;
 import org.slf4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 import com.vaadin.data.Property.ValueChangeEvent;
 import com.vaadin.data.Property.ValueChangeListener;
@@ -66,23 +79,31 @@
 	private LinkedBlockingQueue<ValueChangeEvent> queue = new LinkedBlockingQueue<>();
 	private AtomicBoolean active = new AtomicBoolean(false);
 	private transient Thread thread;
-
 	private boolean showCaption;
-
 	private int numMultiRows;
+	private transient JAXBContext ctx;
+	private transient Marshaller marshaller;
+	private transient Unmarshaller unmarshaller;
+
 	/**
 	 * Instantiates a new datamart filter generator.
 	 *
 	 * @param datamart the datamart
 	 * @param dslMetadataService the dsl metadata service
 	 */
-	public DatamartFilterGenerator(IDataMart datamart, IEclipseContext eclipseContext, boolean  showCaption, int numMultiRows) {
+	public DatamartFilterGenerator(@NotNull IDataMart datamart,@NotNull IEclipseContext eclipseContext, boolean  showCaption, int numMultiRows) {
 		this.datamart = datamart;
 		this.dslMetadataService = eclipseContext.get(IDSLMetadataService.class);
 		this.showCaption = showCaption;
 		this.numMultiRows = numMultiRows;
-		if(this.datamart != null && datamart.getUser() != null) {
-			this.datamart.getUser().addUserLocaleListener(this);
+		this.datamart.getUser().addUserLocaleListener(this);
+		try {
+			ctx = JAXBContext.newInstance(DatamartFilter.class);
+			marshaller = ctx.createMarshaller();
+			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+			unmarshaller = ctx.createUnmarshaller();
+		} catch (JAXBException e) {
+			logger.error("cannot ceate JAXB marshaller {}", e);
 		}
 
 		active.set(true);
@@ -91,15 +112,10 @@
 			while (active.get()) {
 				try {
 					ValueChangeEvent event;
-					try {
-						event = queue.take();
-						ui.access(() -> {
-							processValueChange(event);
-						});
-					} catch (InterruptedException e) {
-					}
+					event = queue.take();
+					ui.access(() -> processValueChange(event));
 				} catch (Exception e) {
-					logger.error("{}", e);
+					// nothing to do
 				}
 			}
 		};
@@ -133,19 +149,14 @@
 	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#selectItem(java.lang.String, java.lang.String)
 	 */
 	@Override
-	public void selectItem(String filterID, String selection) {
-		if (selection != null && datamart != null) {
-			String sel = selection.replace("_", " ");
-			ArrayList<DatamartFilter> filters = datamart.getFilters();
-			if (filters != null) {
-				for (DatamartFilter filter : filters) {
-					if(filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getType() != DatamartFilter.FilterType.BY_HISTUUID && filter.getName().equals(filterID)) {
-						for(IDualData item : filter.getData()) {
-							if(item.getSelectionValue().equals(sel)) {
-								filter.getSelector().select(item);
-								return;
-							}
-						}
+	public void selectItem(@NotNull String filterID, @NotNull String selection) {
+		String sel = selection.replace("_", " ");
+		for (DatamartFilter filter : datamart.getFilters()) {
+			if(filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getType() != DatamartFilter.FilterType.BY_HISTUUID && filter.getName().equals(filterID)) {
+				for(IDualData item : filter.getData()) {
+					if(item.getSelectionValue().equals(sel)) {
+						filter.getSelector().select(item);
+						return;
 					}
 				}
 			}
@@ -203,15 +214,10 @@
 	 */
 	@Override
 	public void resetItem(String filterID) {
-		if (datamart != null) {
-			ArrayList<DatamartFilter> filters = datamart.getFilters();
-			if (filters != null) {
-				for (DatamartFilter filter : filters) {
-					if(filter.getType() != DatamartFilter.FilterType.BY_ID) {
-						filter.getSelector().select(filter.getSelector().getFirstItem());
-						return;
-					}
-				}
+		for (DatamartFilter filter : datamart.getFilters()) {
+			if(filter.getType() != DatamartFilter.FilterType.BY_ID) {
+				filter.getSelector().select(filter.getSelector().getFirstItem());
+				return;
 			}
 		}
 	}
@@ -223,47 +229,44 @@
 	public boolean createUIFilters(IViewLayoutManager layoutManager) {
 		DatamartUiFilterFactory filterFactory = new DatamartUiFilterFactory(); 
 		boolean hasFilters = false;
-		if(datamart != null) {
-			datamart.renderFilters();
-			ArrayList<DatamartFilter> filters = datamart.getFilters();
-			if (filters != null) {
-				hasFilters = true;
-				for (DatamartFilter filter : filters) {
-					switch (filter.getType()) {
-					case BY_ID:
-					case BY_HISTUUID:
-						break;
-					case SQL:
-					case SLICER:
-					case EXCEPT:
-					case HIERARCHY:
-						filter.setSelector((IDatamartSelectable)filterFactory.getUiFilter(filter, numMultiRows));
-						if(filter.getMultipleType() == MultipleType.MULTIPLE) {
-							layoutManager.getSideArea().addComponent((Component)filter.getSelector());
-						} else {
-							layoutManager.getTopArea().addComponent((Component)filter.getSelector());
-						}
-						break;
-					case BETWEEN:
-					case BETWEEN_DATE:
-						filter.setBetweenInputComponent((IDatamartBetweenInput)filterFactory.getUiFilter(filter, numMultiRows));
-						layoutManager.getTopArea().addComponent((Component) filter.getBetweenInputComponent());
-						break;
-					default:
-						break;
-					}
-					if(filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getType() != DatamartFilter.FilterType.BY_HISTUUID) {
-						if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()){
-							filter.getBetweenInputComponent().addValueChangeListener(this);
-						} else {
-							filter.getSelector().addValueChangeListener(this);
-						}
-					}
+		datamart.renderFilters();
+		hasFilters = true;
+		for (DatamartFilter filter : datamart.getFilters()) {
+			switch (filter.getType()) {
+			case BY_ID:
+			case BY_HISTUUID:
+				break;
+			case SQL:
+			case SLICER:
+			case EXCEPT:
+			case HIERARCHY:
+				filter.setSelector((IDatamartSelectable)filterFactory.getUiFilter(filter, numMultiRows));
+				if(filter.getMultipleType() == MultipleType.MULTIPLE) {
+					layoutManager.getSideArea().addComponent((Component)filter.getSelector());
+				} else {
+					layoutManager.getTopArea().addComponent((Component)filter.getSelector());
+				}
+				break;
+			case BETWEEN:
+			case BETWEEN_DATE:
+				filter.setBetweenInputComponent((IDatamartBetweenInput)filterFactory.getUiFilter(filter, numMultiRows));
+				layoutManager.getTopArea().addComponent((Component) filter.getBetweenInputComponent());
+				break;
+			default:
+				break;
+			}
+			if(filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getType() != DatamartFilter.FilterType.BY_HISTUUID) {
+				if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()){
+					filter.getBetweenInputComponent().addValueChangeListener(this);
+				} else {
+					filter.getSelector().addValueChangeListener(this);
 				}
 			}
-			localeChanged(datamart.getUser().getLocale());
-			getSelections();
+			if(filter.getSelector() != null) {
+				filter.getSelector().setSelectedItems(loadFilter(filter));
+			}
 		}
+		localeChanged(datamart.getUser().getLocale());
 		return hasFilters;
 	}
 
@@ -272,15 +275,10 @@
 	 */
 	@Override
 	public void updateFilter() {
-		if(datamart != null) {
-			datamart.renderFilters();
-			ArrayList<DatamartFilter> filters = datamart.getFilters();
-			if (filters != null) {
-				for (DatamartFilter filter : filters) {
-					if(filter.getType() != DatamartFilter.FilterType.BY_ID) {
-						filter.getSelector().update(filter.getData());
-					}
-				}
+		datamart.renderFilters();
+		for (DatamartFilter filter : datamart.getFilters()) {
+			if(filter.getType() != DatamartFilter.FilterType.BY_ID) {
+				filter.getSelector().update(filter.getData());
 			}
 		}
 	}
@@ -292,39 +290,34 @@
 	 */
 	private boolean getSelections() {
 		boolean allFiltersSet = true;
-		if(datamart != null) {
-			ArrayList<DatamartFilter> filters = datamart.getFilters();
-			if (filters != null) {
-				for (DatamartFilter filter : filters) {
-					filter.clearSelectedData();
-					switch (filter.getType()) {
-					case BY_ID:
-					case BY_HISTUUID:
-						break;
-					case EXCEPT:
-						filter.setSelectedData(filter.getSelector().getSelectedItems());
-						break;
-					case SQL:
-					case SLICER:
-					case HIERARCHY:
-						if(filter.getSelector() instanceof DatamartSingleSelect) {
-							if(filter.getSelector().getValue() != null) {
-								filter.addSelectedItem((IDualData)filter.getSelector().getValue());
-							} else {
-								filter.clearSelectedData();
-								allFiltersSet = false;
-							}
-						} else {
-							filter.setSelectedData(filter.getSelector().getSelectedItems());
-							if(filter.getSelector().getSelectedItems().isEmpty()) {
-								allFiltersSet = false;
-							}
-						}
-						break;
-					default:
-						break;
+		for (DatamartFilter filter : datamart.getFilters()) {
+			filter.clearSelectedData();
+			switch (filter.getType()) {
+			case BY_ID:
+			case BY_HISTUUID:
+				break;
+			case EXCEPT:
+				filter.setSelectedData(filter.getSelector().getSelectedItems());
+				break;
+			case SQL:
+			case SLICER:
+			case HIERARCHY:
+				if(filter.getSelector() instanceof DatamartSingleSelect) {
+					if(filter.getSelector().getValue() != null) {
+						filter.addSelectedItem((IDualData)filter.getSelector().getValue());
+					} else {
+						filter.clearSelectedData();
+						allFiltersSet = false;
+					}
+				} else {
+					filter.setSelectedData(filter.getSelector().getSelectedItems());
+					if(filter.getSelector().getSelectedItems().isEmpty()) {
+						allFiltersSet = false;
 					}
 				}
+				break;
+			default:
+				break;
 			}
 		}
 		return allFiltersSet;
@@ -381,60 +374,117 @@
 		if(getSelections()) {
 			// get the filter that changed
 			DatamartFilter changedFilter = null;
-			if(datamart != null) {
-				ArrayList<DatamartFilter> filters = datamart.getFilters();
-				if (filters != null) {
-					for (DatamartFilter filter : filters) {
-						if (filter.getType() == DatamartFilter.FilterType.BETWEEN || filter.getType() == DatamartFilter.FilterType.BETWEEN_DATE) {
-							if (!filter.getBetweenInputComponent().getFrom().isEmpty() && filter.getBetweenInputComponent().getUntilInput().equals(event.getProperty())){
+			for (DatamartFilter filter : datamart.getFilters()) {
+				if (filter.getType() == DatamartFilter.FilterType.BETWEEN || filter.getType() == DatamartFilter.FilterType.BETWEEN_DATE) {
+					IDatamartBetweenInput betweenInputComponent = filter.getBetweenInputComponent();
+					if (((!betweenInputComponent.getFrom().isEmpty() && betweenInputComponent.getUntilInput().equals(event.getProperty())) ||
+						(!betweenInputComponent.getUntil().isEmpty() && betweenInputComponent.getFromInput().equals(event.getProperty())))){
+						if (betweenInputComponent instanceof DatamartBetweenDate) {
+							DateTimeFormatter formatter = DateTimeFormatter.ofPattern(((DatamartBetweenDate)betweenInputComponent).getFormatter().toPattern());
+							if (LocalDate.parse(betweenInputComponent.getFrom(), formatter).isBefore(LocalDate.parse(betweenInputComponent.getUntil(), formatter))){
 								changedFilter = filter;
 								break;
 							}
-						} else if (filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getSelector().equals(event.getProperty())) {
-							changedFilter = filter;
-							break;
 						}
 					}
+				} else if (filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getSelector().equals(event.getProperty())) {
+					changedFilter = filter;
+					break;
 				}
 			}
-			// notify the listeners of the changed filter
-			for(FilterChangeListener listener:listeners) {
-				if(changedFilter != null) {
+			if(changedFilter != null) {
+				saveFilter(changedFilter);
+				// notify the listeners of the changed filter
+				for(FilterChangeListener listener:listeners) {
 					listener.filterChanged(changedFilter);
 				}
 			}
 		}
 	}
 
+	private List<IDualData> loadFilter(DatamartFilter filter) {
+		String filterName = filter.getName().replace("[", "").replace("]", "");
+		Document doc = this.datamart.getUser().getFilterDocument();
+		Element root = (Element) doc.getElementsByTagName(IUser.docRoot).item(0);
+		NodeList dmList = root.getElementsByTagName(datamart.getName());
+		Element datamartEl = null;
+		if(dmList.getLength() > 0) {
+			datamartEl = (Element) dmList.item(0);
+			NodeList fiList = datamartEl.getElementsByTagName(filterName);
+			Element filterEl = null;
+			if(fiList.getLength() > 0) {
+				filterEl = (Element) fiList.item(0);
+				NodeList filters = filterEl.getElementsByTagName("filter");
+				try {
+					DatamartFilter loadedFilter = (DatamartFilter)unmarshaller.unmarshal((Node)filters.item(0));
+					filter.setSelectedData(loadedFilter.getSelectedData());
+					return loadedFilter.getSelectedData();
+				} catch (JAXBException e) {
+					logger.error("{}", e);
+				}
+			}
+		}
+		return null;
+	}
+
+	private void saveFilter(DatamartFilter filter) {
+		String filterName = filter.getName().replace("[", "").replace("]", "");
+		Document doc = this.datamart.getUser().getFilterDocument();
+		Element root = (Element) doc.getElementsByTagName(IUser.docRoot).item(0);
+		NodeList dmList = root.getElementsByTagName(datamart.getName());
+		Element datamartEl = null;
+		if(dmList.getLength() == 0) {
+			datamartEl = doc.createElement(datamart.getName());
+			root.appendChild(datamartEl);
+		} else {
+			datamartEl = (Element) dmList.item(0);
+		}
+		NodeList fiList = datamartEl.getElementsByTagName(filterName);
+		Element filterEl = null;
+		if(fiList.getLength() == 0) {
+			filterEl = doc.createElement(filterName);
+			datamartEl.appendChild(filterEl);
+		} else {
+			filterEl = (Element) fiList.item(0);
+			NodeList filters = filterEl.getElementsByTagName("filter");
+			while(filters.getLength() > 0) {
+				filterEl.removeChild(filters.item(0));
+			}
+		}
+		try {
+			marshaller.marshal(filter, (Node)filterEl);
+			datamart.getUser().saveFilterDocument();
+		} catch (JAXBException e) {
+			logger.error("{}", e);
+		}
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.osbp.ui.api.user.IUser.UserLocaleListener#localeChanged(java.util.Locale)
 	 */
 	@Override
 	public void localeChanged(final Locale locale) {
-		if(datamart != null) {
-			ArrayList<DatamartFilter> filters = datamart.getFilters();
-			if (filters != null) {
-				for (DatamartFilter filter : filters) {
-					if(filter.getSelector() != null || filter.getBetweenInputComponent() != null) {
-						StringBuilder text = new StringBuilder();
-						if(filter.getType()==FilterType.EXCEPT) {
-							text.append(dslMetadataService.translate(locale.toLanguageTag(), "exceptFor"));
-							text.append(" ");
-						}
-						text.append(dslMetadataService.translate(locale.toLanguageTag(), getTranslatableKey(filter.getName())));
-						if (showCaption) {
-							if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()) {
-								filter.getBetweenInputComponent().setCaption(text.toString());
-							} else {
-								filter.getSelector().setCaption(text.toString());
-							}
-						} 
-						if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()) {
-							filter.getBetweenInputComponent().setDescription(text.toString());
-						} else {
-							filter.getSelector().setDescription(text.toString());
-						}
+		for (DatamartFilter filter : datamart.getFilters()) {
+			if(filter.getSelector() != null || filter.getBetweenInputComponent() != null) {
+				StringBuilder text = new StringBuilder();
+				if(filter.getType()==FilterType.EXCEPT) {
+					text.append(dslMetadataService.translate(locale.toLanguageTag(), "exceptFor"));
+					text.append(" ");
+				}
+				text.append(dslMetadataService.translate(locale.toLanguageTag(), getTranslatableKey(filter.getName())));
+				if (showCaption) {
+					if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()) {
+						filter.getBetweenInputComponent().setCaption(text.toString());
+						filter.getBetweenInputComponent().setLocale(locale);
+					} else {
+						filter.getSelector().setCaption(text.toString());
 					}
+				} 
+				if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()) {
+					filter.getBetweenInputComponent().setDescription(text.toString());
+					filter.getBetweenInputComponent().setLocale(locale);
+				} else {
+					filter.getSelector().setDescription(text.toString());
 				}
 			}
 		}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java
index 2ea52a9..e734d1c 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java
@@ -35,6 +35,7 @@
 	private String hierarchy = null;
 	private IDualData firstItem = null;
 	private boolean selectFirst;
+	private List<IDualData> preSelectedItems;
 
 	@SuppressWarnings("unchecked")
 	@Override
@@ -72,6 +73,7 @@
 			@Override
 			public void run() {
 				removeAllItems();
+				// select the first option
 				firstItem = null;
 				for (IDualData dd : options) {
 					setHierarchy(dd.getHierarchy());
@@ -86,8 +88,13 @@
 				}
 				// always select the first option
 				Collection<IDualData> selectedItems = new ArrayList<IDualData>();
+				if(preSelectedItems != null) {
+					selectedItems.addAll(preSelectedItems);
+				}
 				if(selectFirst) {
-					selectedItems.add(firstItem);
+					if(preSelectedItems == null) {
+						selectedItems.add(firstItem);
+					}
 					setNullSelectionAllowed(false);
 				} else {
 					setNullSelectionAllowed(true);
@@ -174,4 +181,9 @@
 	public Object getValue() {
 		return super.getValue();
 	}
+
+	@Override
+	public void setSelectedItems(List<IDualData> selectedItems) {
+		preSelectedItems = selectedItems;
+	}
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java
index fab085e..7d05ec5 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java
@@ -32,6 +32,7 @@
 	private static final long serialVersionUID = -5673052113801450589L;
 	private String hierarchy = null;
 	private IDualData firstItem = null;
+	private List<IDualData> preSelectedItems;
 
 	public static long getSerialversionuid() {
 		return serialVersionUID;
@@ -55,6 +56,7 @@
 			@Override
 			public void run() {
 				removeAllItems();
+				// select the first option
 				firstItem = null;
 				for (IDualData dd : options) {
 					setHierarchy(dd.getHierarchy());
@@ -67,7 +69,9 @@
 						setItemCaption(dd, dd.getFormattedValue());
 					}
 				}
-				// always select the first option
+				if(preSelectedItems != null) {
+					firstItem = preSelectedItems.get(0);
+				}
 				setValue(firstItem);
 				setEnabled(true);
 				setNullSelectionAllowed(false);
@@ -143,4 +147,9 @@
 	public Object getValue() {
 		return super.getValue();
 	}
+
+	@Override
+	public void setSelectedItems(List<IDualData> selectedItems) {
+		preSelectedItems = selectedItems;
+	}
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartUiFilterFactory.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartUiFilterFactory.java
index ba23239..1f88d66 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartUiFilterFactory.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartUiFilterFactory.java
@@ -42,7 +42,7 @@
 				uiFilters.put(filter.getName(), new DatamartBetweenText());
 				break;
 			case BETWEEN_DATE:
-				uiFilters.put(filter.getName(), new DatamartBetweenDate(filter.format, filter.resolution));
+				uiFilters.put(filter.getName(), new DatamartBetweenDate(filter.getFormat(), filter.getResolution()));
 				break;
 			default:
 				break;
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 7a8e760..3bacbf2 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
@@ -495,9 +495,6 @@
 		case java.sql.Types.BIT:
 			return Member.MemberType.UNKNOWN;
 		case java.sql.Types.NUMERIC:
-			if(scale == 0) {
-				return Member.MemberType.UNKNOWN;
-			}
 			return Member.MemberType.MEASURE;
 		case java.sql.Types.DECIMAL:
 		case java.sql.Types.DOUBLE:
@@ -565,11 +562,14 @@
 		case java.sql.Types.LONGVARBINARY:
 			return rs.getBytes(idx) != null ? new String(Base64.getDecoder().decode(rs.getBytes(idx))) : "";
 		case java.sql.Types.BLOB:
-			return rs.getBlob(idx);
+			return rs.getBytes(idx) != null ? new String(Base64.getDecoder().decode(rs.getBytes(idx))) : "";
+//			return rs.getBlob(idx);
 		case java.sql.Types.CLOB:
-			return rs.getClob(idx);
+			return rs.getBytes(idx) != null ? new String(Base64.getDecoder().decode(rs.getBytes(idx))) : "";
+//			return rs.getClob(idx);
 		case java.sql.Types.NCLOB:
-			return rs.getNClob(idx);
+			return rs.getBytes(idx) != null ? new String(Base64.getDecoder().decode(rs.getBytes(idx))) : "";
+//			return rs.getNClob(idx);
 		case java.sql.Types.DATALINK:
 			return rs.getCharacterStream(idx);
 		case java.sql.Types.SQLXML:
@@ -621,7 +621,7 @@
     		case java.sql.Types.BLOB:
     		case java.sql.Types.CLOB:
     		case java.sql.Types.NCLOB:
-    			formattedValue = "LOB";
+    			formattedValue = rs.getBytes(idx) != null ? new String(Base64.getDecoder().decode(rs.getBytes(idx))) : "";
     			break;
     		case java.sql.Types.DATALINK:
     			formattedValue = "DATALINK";