blob: a951fd5b204686bfa1df7bb78c7c65e2a224bb2a [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*/
package org.eclipse.osbp.xtext.datamart.common;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.eclipse.osbp.ui.api.datamart.IDataMart;
import org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator;
import org.eclipse.osbp.ui.api.datamart.IDatamartSelectable;
import org.eclipse.osbp.ui.api.datamart.IDualData;
import org.eclipse.osbp.ui.api.layout.IViewLayoutManager;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.user.IUser;
import org.eclipse.osbp.utils.theme.EnumCssClass;
import org.eclipse.osbp.utils.vaadin.ViewLayoutManager;
import org.eclipse.osbp.xtext.i18n.I18NKeyGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.ui.AbstractOrderedLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.VerticalLayout;
// creates a filtermap from selected and multiselected components.
// For cubes the class creates permutated slices over all filter aspects
public class DatamartFilterGenerator implements IDatamartFilterGenerator {
private static Logger log = LoggerFactory
.getLogger(DatamartFilterGenerator.class);
// the key is the same as the filterMap key
// the selection component is therefore associated with the filterMap id and
// so with the event id
private Map<String, IDatamartSelectable> selectors = new HashMap<String, IDatamartSelectable>();
private boolean idMode = false;
private String id = null;
private String idProperty;
private boolean cube = false;
private HorizontalLayout selectionArea = null;
private IDSLMetadataService dslMetadataService;
private boolean showCaption;
@Override
public void setDslMetadataService(IDSLMetadataService dslMetadataService) {
this.dslMetadataService = dslMetadataService;
}
@Override
public void setId(String idProperty, String id) {
idMode = true;
this.idProperty = idProperty;
this.id = id;
}
@Override
public void resetId() {
idMode = false;
}
@Override
public Map<String, IDatamartSelectable> getSelectors() {
return selectors;
}
@Override
public boolean isCube() {
return cube;
}
@Override
public void setCube(boolean cube) {
this.cube = cube;
}
@Override
public void selectItem(String filter, String selection) {
if (selection != null) {
String sel = selection.replace("_", " ");
if (selectors.containsKey(filter)) {
for (Object id : selectors.get(filter).getContainerDataSource()
.getItemIds()) {
if (((IDualData) id).getSignificantValue().equals(sel)) {
selectors.get(filter).select(id);
break;
}
}
}
}
}
@Override
public void resetItem(String filter) {
if (selectors.containsKey(filter)) {
selectors.get(filter).select(selectors.get(filter).getFirstItem());
}
}
private String getTranslatableKey(String filterName) {
return I18NKeyGenerator.key(stripHierarchy(filterName));
}
private String stripMDXCharacters(String filterName) {
return filterName.replace(IDataMart.singleSelectDecorator, "").replace(IDataMart.multiSelectDecorator, "").replace(IDataMart.exceptDecorator, "")
.replace(IDataMart.slicerSingleSelectDecorator, "").replace(IDataMart.slicerMultiSelectDecorator, "").replace("[", "")
.replace("]", "");
}
private String stripHierarchy(String filterName) {
String result = filterName;
String[] parts = stripMDXCharacters(filterName).split("\\.");
int len = parts.length;
if (len > 0) {
result = parts[len - 1];
}
return result.replace(".", " ");
}
@Override
public boolean createFilter(IDataMart datamart, IUser user,
ValueChangeListener filterChangeListener,
IViewLayoutManager layoutManager) {
return createFilter(datamart, user, filterChangeListener, layoutManager, false);
}
@Override
public boolean createFilter(IDataMart datamart, IUser user,
ValueChangeListener filterChangeListener,
IViewLayoutManager layoutManager,
boolean showCaption) {
boolean hasFilters = false;
this.showCaption = showCaption;
HashMap<String, ArrayList<IDualData>> filters = datamart
.getFilters(user);
if ((filters != null) && filters.size() > 0) {
for (String filter : filters.keySet()) {
if (!hasFilters) {
hasFilters = true;
}
// the id filter solution
if (!filters.get(filter).contains(IDataMart.filterIdPlaceholder)) {
boolean isSingleSelect = false;
boolean isMultiSelect = false;
boolean isSlicer = false;
boolean isExcept = false;
if (filter.contains(IDataMart.multiSelectDecorator)) {
isMultiSelect = true;
}
if (filter.contains(IDataMart.singleSelectDecorator)) {
isSingleSelect = true;
}
if (filter.contains(IDataMart.exceptDecorator)) {
isSingleSelect = true;
isExcept = true;
}
if (filter.contains(IDataMart.slicerSingleSelectDecorator)) {
isSingleSelect = true;
isSlicer = true;
}
if (filter.contains(IDataMart.slicerMultiSelectDecorator)) {
isMultiSelect = true;
isSlicer = true;
}
// --- the filter should be UNIQUE for each view ---
if (!selectors.containsKey(filter)) {
IDatamartSelectable box = null;
if (isSingleSelect) {
box = new DatamartSingleSelect(isExcept, isSlicer,
filter, filters.get(filter));
layoutManager.getTopArea().addComponent((Component)box);
} else if (isMultiSelect) {
box = new DatamartMultiSelect(5, false, isSlicer,
filter, filters.get(filter));
layoutManager.getSideArea().addComponent((Component)box);
}
if (box != null && filterChangeListener != null) {
box.addValueChangeListener(filterChangeListener);
}
selectors.put(filter, box);
}
}
}
}
return hasFilters;
}
@Override
public void updateFilter(IDataMart datamart, IUser user,
ValueChangeListener filterChangeListener) {
HashMap<String, ArrayList<IDualData>> filters = datamart
.getFilters(user);
if ((filters != null) && filters.size() > 0) {
for (String filter : filters.keySet()) {
if (selectors.containsKey(filter)) {
if(filterChangeListener != null) {
selectors.get(filter).removeValueChangeListener(
filterChangeListener);
}
selectors.get(filter).update(filters.get(filter));
if(filterChangeListener != null) {
selectors.get(filter).addValueChangeListener(
filterChangeListener);
}
}
}
}
}
@Override
public Map<String, String> getFilter(boolean isCube) {
Map<String, String> filters = new HashMap<String, String>();
setCube(isCube);
if (idMode) {
idMode = false;
filters.put(idProperty, id);
return filters;
}
boolean hasSlicer = false;
boolean isMultiSelected = false;
for (String selector : selectors.keySet()) {
if (selectors.get(selector).isSlicer()) {
hasSlicer = true;
}
if (selectors.get(selector).isMultiSelected()) {
isMultiSelected = true;
}
}
if (!isCube || !hasSlicer || !isMultiSelected) {
for (String selector : selectors.keySet()) {
if (selectors.get(selector) instanceof DatamartMultiSelect) {
String selection = "";
for (IDualData item : selectors.get(selector)
.getSelectedItems()) {
if (item != null) {
if (!selection.isEmpty()) {
selection += ",";
}
selection += item.getSelectionValue();
}
}
filters.put(selectors.get(selector).getFilterName(),
selection);
} else {
try {
filters.put(
selectors.get(selector).getFilterName(),
((IDualData) selectors.get(selector).getValue())
.getSelectionValue());
} catch (NullPointerException npe) {
log.error("NPE for "
+ selectors.get(selector).getFilterName(), npe);
}
}
}
} else {
String firstFilter = null;
List<List<String>> filterGroup = new ArrayList<List<String>>();
for (String multiSelect : selectors.keySet()) {
if (selectors.get(multiSelect) instanceof DatamartMultiSelect) {
if (selectors.get(multiSelect).isSlicer()) {
List<String> myList = new ArrayList<String>();
for (IDualData item : selectors.get(multiSelect)
.getSelectedItems()) {
if (item != null) {
myList.add(item.getSelectionValue());
}
}
filterGroup.add(myList);
if (firstFilter == null) {
firstFilter = selectors.get(multiSelect)
.getFilterName();
} else {
filters.put(selectors.get(multiSelect)
.getFilterName(), "<empty>");
}
} else {
String selection = "";
for (IDualData item : selectors.get(multiSelect)
.getSelectedItems()) {
if (item != null) {
if (!selection.isEmpty()) {
selection += ",";
}
selection += item.getSelectionValue();
}
}
filters.put(selectors.get(multiSelect).getFilterName(),
selection);
}
} else {
if (selectors.get(multiSelect).isSlicer()) {
List<String> myList = new ArrayList<String>();
for (IDualData item : selectors.get(multiSelect)
.getSelectedItems()) {
if (item != null) {
myList.add(item.getSelectionValue());
}
}
filterGroup.add(myList);
if (firstFilter == null) {
firstFilter = selectors.get(multiSelect)
.getFilterName();
} else {
filters.put(selectors.get(multiSelect)
.getFilterName(), "<empty>");
}
} else if (selectors.get(multiSelect).getValue() != null) {
try {
filters.put(selectors.get(multiSelect)
.getFilterName(), ((IDualData) selectors
.get(multiSelect).getValue())
.getSelectionValue());
} catch (NullPointerException npe) {
log.error("NPE for "
+ selectors.get(multiSelect)
.getFilterName(), npe);
}
}
}
}
// calculate every permutation of selection as slices must be
// created
List<List<String>> permutations = new ArrayList<List<String>>();
int numEntries = 1;
for (List<String> list : filterGroup) {
numEntries *= list.size();
}
for (int i = 0; i < numEntries; i++) {
permutations.add(new ArrayList<String>());
}
for (List<String> itemList : filterGroup) {
Iterator<String> iterator = itemList.iterator();
if (iterator.hasNext()) {
for (List<String> entry : permutations) {
entry.add(iterator.next());
if (!iterator.hasNext()) {
iterator = itemList.iterator();
}
}
}
}
String set = "";
boolean firstSet = true;
for (List<String> permutation : permutations) {
boolean firstTuple = true;
String tuple = "";
for (String item : permutation) {
if (firstTuple) {
firstTuple = false;
} else {
tuple += ",";
}
tuple += item;
}
if (firstSet) {
firstSet = false;
} else {
set += ",";
}
set += "(" + tuple + ")";
}
filters.put(firstFilter, "{" + set + "}");
}
return filters;
}
@Override
public void setLocale(Locale locale) {
if (dslMetadataService != null) {
for (String sel : selectors.keySet()) {
if (showCaption) {
selectors.get(sel).setCaption(
dslMetadataService.translate(
locale.toLanguageTag(),
getTranslatableKey(selectors.get(sel)
.getFilterName())));
}
selectors.get(sel).setDescription(
dslMetadataService.translate(locale.toLanguageTag(),
getTranslatableKey(selectors.get(sel)
.getFilterName())));
}
}
}
}