| /** |
| * |
| * 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()))); |
| } |
| } |
| } |
| } |