/**
* Copyright 2011 Intuit Inc. All Rights Reserved
*/
package com.intuit.tank.wrapper;
/*
* #%L
* JSF Support Beans
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* 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
* #L%
*/
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.primefaces.event.data.FilterEvent;
import com.intuit.tank.prefs.TablePreferences;
import com.intuit.tank.prefs.TableViewState;
import com.intuit.tank.util.Multiselectable;
import com.intuit.tank.util.SelectionTracker;
import com.intuit.tank.view.filter.ViewFilterType;
/**
* SelectableBean
*
* @author dangleton
*
*/
public abstract class SelectableBean<T> implements Multiselectable<T> {
private static final Logger LOG = LogManager.getLogger(SelectableBean.class);
private List<SelectableWrapper<T>> selectionList;
private List<SelectableWrapper<T>> filteredData;
private SelectionTracker<T> selectionTracker = new SelectionTracker<T>(this);
private ViewFilterType viewFilterType = ViewFilterType.ALL;
private boolean needsRefresh = false;
protected TablePreferences tablePrefs;
protected TableViewState tableState = new TableViewState();
/**
* @return the tablePrefs
*/
public TablePreferences getTablePrefs() {
return tablePrefs;
}
/**
* @return the tableState
*/
public TableViewState getTableState() {
return tableState;
}
public ViewFilterType[] getViewFilterTypeList() {
return ViewFilterType.values();
}
/**
*
* @{inheritDoc
*/
public void deleteSelected() {
ArrayList<SelectableWrapper<T>> copied = new ArrayList<SelectableWrapper<T>>(getSelectionList());
for (SelectableWrapper<T> wrapper : copied) {
if (wrapper.isSelected()) {
delete(wrapper.getEntity());
}
}
}
/**
*
* @{inheritDoc
*/
public void selectAll() {
selectionTracker.selectAll();
}
/**
*
* @{inheritDoc
*/
public void unselectAll() {
selectionTracker.unselectAll();
}
/**
*
* @{inheritDoc
*/
public boolean hasSelected() {
return selectionTracker.hasSelected();
}
/**
* @{inheritDoc
*/
@Override
public List<SelectableWrapper<T>> getSelectionList() {
if (selectionList == null || !isCurrent() || needsRefresh) {
List<T> l = getEntityList(this.viewFilterType);
selectionList = new ArrayList<SelectableWrapper<T>>();
for (T entity : l) {
selectionList.add(new SelectableWrapper<T>(entity));
}
needsRefresh = false;
}
return selectionList;
}
public List<SelectableWrapper<T>> getFilteredData() {
if (filteredData == null) {
if (selectionList == null ) {
return getSelectionList();
}
return selectionList;
}
return filteredData;
}
/**
* @param filteredData
* the filteredData to set
*/
public void setFilteredData(List<SelectableWrapper<T>> filteredData) {
this.filteredData = filteredData;
if (filteredData != null) {
unselect(filteredData);
}
}
/**
* @param filteredData2
*/
private void unselect(List<SelectableWrapper<T>> filteredData2) {
Set<SelectableWrapper<T>> set = new HashSet<SelectableWrapper<T>>(filteredData2);
for (SelectableWrapper<T> wrapper : getSelectionList()) {
if (wrapper.isSelected() && !set.contains(wrapper)) {
wrapper.setSelected(false);
}
}
}
public void refresh() {
needsRefresh = true;
selectionList = getSelectionList();
filteredData = null;
}
public ViewFilterType getViewFilterType() {
return viewFilterType;
}
public void setViewFilterType(ViewFilterType viewFilterType) {
this.viewFilterType = viewFilterType;
}
@SuppressWarnings({ "unchecked", "deprecation" })
public void onFilter(FilterEvent event) {
filteredData = (List<SelectableWrapper<T>>) event.getData();
}
/* public void onFilter(AjaxBehaviorEvent event) {
DataTable dataTable = (DataTable) event.getSource();
@SuppressWarnings("unchecked") ArrayList<SelectableWrapper<T>> tempList = (ArrayList<SelectableWrapper<T>>) dataTable
.getFilteredValue();
// ArrayList<SelectableWrapper<T>> tempList = (ArrayList<SelectableWrapper<T>>)dataTable.getFilteredData();
if (tempList != null) {
filteredData = tempList;
} else {
filteredData = selectionList;
}
}
*/
public abstract List<T> getEntityList(ViewFilterType viewFilter);
public abstract void delete(T entity);
public abstract boolean isCurrent();
}