Skip to content

Commit

Permalink
Merge pull request #2 from Jayeshecs/data-type-support
Browse files Browse the repository at this point in the history
Added abstract implementation for filterable dashboard
  • Loading branch information
Jayeshecs committed Jan 4, 2020
2 parents d3af218 + 87becbb commit 5becc5f
Show file tree
Hide file tree
Showing 2 changed files with 156 additions and 120 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/**
*
*/
package domainapp.modules.base.view.dashboard;

import java.util.Arrays;
import java.util.Base64;
import java.util.List;

import org.apache.isis.applib.ViewModel;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.annotation.PropertyLayout;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.services.hint.HintStore.HintIdProvider;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import domainapp.modules.base.datatype.DataTypeUtil;
import domainapp.modules.base.service.SessionStoreFactory;
import domainapp.modules.base.view.GenericFilter;
import domainapp.modules.base.view.Value;
import lombok.Getter;
import lombok.Setter;

/**
* @author Prajapati
*
*/
public abstract class AbstractFilterableDashboard implements HintIdProvider, ViewModel {

@PropertyLayout(hidden = Where.EVERYWHERE)
@Getter @Setter
protected GenericFilter filter;

protected AbstractFilterableDashboard() {
// DO NOTHING
}

/**
* @return
*/
private String getFilterAttribute() {
return "filter_" + getClass().getSimpleName();
}

protected abstract GenericFilter defaultFilter();

/**
* @return
*/
@Programmatic
private String filterToJson() {
if (getFilter() == null) {
setFilter(defaultFilter());
}
String json = createGsonBuilder().toJson(getFilter());
return Base64.getUrlEncoder().encodeToString(json.getBytes());
}

/**
* @param jsonUrlEncoded
* @return
*/
@Programmatic
private GenericFilter jsonToFilter(String jsonUrlEncoded) {
String json = new String(Base64.getUrlDecoder().decode(jsonUrlEncoded.getBytes()));
GenericFilter genericFilter = createGsonBuilder().fromJson(json, GenericFilter.class);
return genericFilter;
}

protected void saveFilter() {
SessionStoreFactory.INSTANCE.getSessionStore().set(getFilterAttribute(), filterToJson());
}

@Override
public String hintId() {
String filter = SessionStoreFactory.INSTANCE.getSessionStore().get(getFilterAttribute());
if (filter != null) {
setFilter(jsonToFilter(filter));
return filter;
}
return filterToJson();
}

@Override
public String viewModelMemento() {
String filter = SessionStoreFactory.INSTANCE.getSessionStore().get(getFilterAttribute());
if (filter != null) {
return filter;
}
String json = filterToJson();
return json;
}

@Override
public void viewModelInit(String memento) {
String filter = SessionStoreFactory.INSTANCE.getSessionStore().get(getFilterAttribute());
if (filter == null) {
filter = memento;
}
setFilter(jsonToFilter(filter));
}

/**
* @return
*/
private Gson createGsonBuilder() {
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
return builder.create();
}

/**
* @param key
* @return
*/
@SuppressWarnings("unchecked")
protected <T> List<T> getUserInputValueAsList(String key) {
GenericFilter filter = getFilter();
if (filter != null) {
Value value = filter.getParameters().get(key);
if (value != null) {
Object object = DataTypeUtil.valueToObject(value);
if (object instanceof List) {
return (List<T>)object;
}
return Arrays.asList((T)object);
}
}
return null;
}

/**
* @param key
* @return
*/
@SuppressWarnings("unchecked")
protected <T> T getUserInputValue(String key) {
List<Object> userInputValueAsList = getUserInputValueAsList(key);
if (userInputValueAsList == null || userInputValueAsList.isEmpty()) {
return null;
}
return (T)userInputValueAsList.get(0);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -29,7 +27,6 @@

import javax.inject.Inject;

import org.apache.isis.applib.ViewModel;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.ActionLayout.Position;
Expand All @@ -48,24 +45,19 @@
import org.apache.isis.applib.annotation.Property;
import org.apache.isis.applib.annotation.PropertyLayout;
import org.apache.isis.applib.annotation.SemanticsOf;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.services.hint.HintStore;
import org.apache.isis.applib.services.i18n.TranslatableString;
import org.apache.isis.applib.services.message.MessageService;
import org.apache.isis.applib.value.Blob;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import domainapp.modules.addon.service.AddonService;
import domainapp.modules.base.datatype.DataTypeUtil;
import domainapp.modules.base.entity.NamedQueryConstants;
import domainapp.modules.base.entity.WithDescription;
import domainapp.modules.base.entity.WithName;
import domainapp.modules.base.service.OrderBy;
import domainapp.modules.base.service.SessionStoreFactory;
import domainapp.modules.base.view.GenericFilter;
import domainapp.modules.base.view.Value;
import domainapp.modules.base.view.dashboard.AbstractFilterableDashboard;
import domainapp.modules.rdr.addon.IStatementReaderContext;
import domainapp.modules.rdr.addon.StatementReaderContext;
import domainapp.modules.rdr.api.IStatementReader;
Expand All @@ -83,8 +75,6 @@
import domainapp.modules.txn.service.StatementSourceService;
import domainapp.modules.txn.service.TransactionService;
import domainapp.modules.txn.service.TransactionService.TransactionFilterFields;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
Expand All @@ -96,13 +86,7 @@
objectType = "stmt.ManageTransactionDashboard"
)
@Slf4j
public class ManageTransactionDashboard implements HintStore.HintIdProvider, ViewModel {

private static final String SESSION_ATTRIBUTE_FILTER = "filter";

@PropertyLayout(hidden = Where.EVERYWHERE)
@Getter @Setter
protected GenericFilter filter;
public class ManageTransactionDashboard extends AbstractFilterableDashboard {

/**
* @return
Expand All @@ -116,73 +100,12 @@ public String title() {
*
*/
@Programmatic
private GenericFilter defaultFilter() {
protected GenericFilter defaultFilter() {
GenericFilter filter = new GenericFilter();
filter.setFilter(FieldConstants.CATEGORY + " == null && " + FieldConstants.SUB_CATEGORY + " == null");
filter.setExclude(new HashSet<String>(Arrays.asList(TransactionService.TransactionFilterFields.UNCATEGORIZED, TransactionService.TransactionFilterFields.NARRATION)));
return filter;
}

/**
* @return
*/
@Programmatic
private String filterToJson() {
if (getFilter() == null) {
setFilter(defaultFilter());
}
String json = createGsonBuilder().toJson(getFilter());
return Base64.getUrlEncoder().encodeToString(json.getBytes());
}

/**
* @return
*/
private Gson createGsonBuilder() {
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
return builder.create();
}

/**
* @param jsonUrlEncoded
* @return
*/
@Programmatic
private GenericFilter jsonToFilter(String jsonUrlEncoded) {
String json = new String(Base64.getUrlDecoder().decode(jsonUrlEncoded.getBytes()));
GenericFilter genericFilter = createGsonBuilder().fromJson(json, GenericFilter.class);
return genericFilter;
}

@Override
public String hintId() {
String filter = SessionStoreFactory.INSTANCE.getSessionStore().get(SESSION_ATTRIBUTE_FILTER);
if (filter != null) {
setFilter(jsonToFilter(filter));
return filter;
}
return filterToJson();
}

@Override
public String viewModelMemento() {
String filter = SessionStoreFactory.INSTANCE.getSessionStore().get(SESSION_ATTRIBUTE_FILTER);
if (filter != null) {
return filter;
}
String json = filterToJson();
return json;
}

@Override
public void viewModelInit(String memento) {
String filter = SessionStoreFactory.INSTANCE.getSessionStore().get(SESSION_ATTRIBUTE_FILTER);
if (filter == null) {
filter = memento;
}
setFilter(jsonToFilter(filter));
}

@Property(editing = Editing.DISABLED, editingDisabledReason = "This is read-only field")
@PropertyLayout(labelPosition = LabelPosition.TOP, named = "Filter", multiLine = 3)
Expand Down Expand Up @@ -449,12 +372,11 @@ public ManageTransactionDashboard reset() {
GenericFilter filter = new GenericFilter();
filter.setExclude(new HashSet<String>(Arrays.asList(TransactionService.TransactionFilterFields.UNCATEGORIZED, TransactionService.TransactionFilterFields.NARRATION)));
Map<String, Value> parameters = filter.getParameters();
Map<String, Object> criteria = new HashMap<String, Object>();
criteria.put("uncategorized", Boolean.FALSE);
Map<String, Object> criteria = new LinkedHashMap<String, Object>();
criteria.put(TransactionService.TransactionFilterFields.UNCATEGORIZED, Boolean.FALSE);
filter.setFilter(transactionService.buildFilter(criteria, parameters));
// filter.setFilter(transactionService.buildFilter(null, null, null, null, null, null, null, null, null, Boolean.FALSE, parameters));
setFilter(filter);
SessionStoreFactory.INSTANCE.getSessionStore().set(SESSION_ATTRIBUTE_FILTER, filterToJson());
saveFilter();
return this;
}

Expand Down Expand Up @@ -500,7 +422,7 @@ public ManageTransactionDashboard filter(
Boolean uncategorized
) {
internalFilter(narration, transactionTypes, source, dateStart, dateEnd, amountFloor, amountCap, categories, subCategories, uncategorized);
SessionStoreFactory.INSTANCE.getSessionStore().set(SESSION_ATTRIBUTE_FILTER, filterToJson());
saveFilter();
return this;
}

Expand All @@ -516,9 +438,10 @@ public ManageTransactionDashboard filter(
* @param subCategories
* @param uncategorized
* @return
* TODO: Move this method in abstract class
*/
@Programmatic
public ManageTransactionDashboard internalFilter(String narration, List<TransactionType> transactionTypes, List<StatementSource> source, Date dateStart,
public void internalFilter(String narration, List<TransactionType> transactionTypes, List<StatementSource> source, Date dateStart,
Date dateEnd, BigDecimal amountFloor, BigDecimal amountCap, List<Category> categories, List<SubCategory> subCategories,
Boolean uncategorized) {
GenericFilter filter = new GenericFilter();
Expand All @@ -537,40 +460,6 @@ public ManageTransactionDashboard internalFilter(String narration, List<Transact
criteria.put(TransactionFilterFields.UNCATEGORIZED, uncategorized);
filter.setFilter(transactionService.buildFilter(criteria, parameters));
setFilter(filter);
return this;
}

/**
* @param key
* @return
*/
@SuppressWarnings("unchecked")
private <T> List<T> getUserInputValueAsList(String key) {
GenericFilter filter = getFilter();
if (filter != null) {
Value value = filter.getParameters().get(key);
if (value != null) {
Object object = DataTypeUtil.valueToObject(value);
if (object instanceof List) {
return (List<T>)object;
}
return Arrays.asList((T)object);
}
}
return null;
}

/**
* @param key
* @return
*/
@SuppressWarnings("unchecked")
private <T> T getUserInputValue(String key) {
List<Object> userInputValueAsList = getUserInputValueAsList(key);
if (userInputValueAsList == null || userInputValueAsList.isEmpty()) {
return null;
}
return (T)userInputValueAsList.get(0);
}

public String default0Filter() {
Expand Down

0 comments on commit 5becc5f

Please sign in to comment.