package org.genedb.web.mvc.controller; import org.apache.log4j.Logger; import org.genedb.querying.core.PagedQuery; import org.genedb.querying.core.Query; import org.genedb.querying.history.HistoryItem; import org.genedb.querying.history.HistoryManager; import org.genedb.querying.history.HistoryType; import org.genedb.querying.history.QueryHistoryItem; import com.google.common.collect.Lists; import java.lang.ref.WeakReference; import java.util.LinkedHashMap; import java.util.List; import javax.servlet.http.HttpSession; /** * @author Adrian Tivey * @author gv1 */ public class HttpSessionHistoryManager implements HistoryManager { private static final Logger logger = Logger.getLogger(HttpSessionHistoryManager.class); // TODO use map for storage // gv1 TODONE //private int nextNumber = 1; //private int version = 1; public static final String HISTORY_LIST = "_HISTORY_LIST"; private static final String DEFAULT_CART_NAME = "Feature Basket"; private WeakReference<HttpSession> sessionReference; private String cartName = DEFAULT_CART_NAME; public HttpSessionHistoryManager(HttpSession session) { this.sessionReference = new WeakReference<HttpSession>(session); } /* (non-Javadoc) * @see org.genedb.web.mvc.controller.HistoryManager#getHistoryItems() */ @SuppressWarnings("unchecked") public LinkedHashMap<String, HistoryItem> getHistoryItems() { LinkedHashMap<String, HistoryItem> ret = (LinkedHashMap<String, HistoryItem>) sessionReference.get().getAttribute(HISTORY_LIST); if (ret == null) { ret = new LinkedHashMap<String, HistoryItem>(); sessionReference.get().setAttribute(HISTORY_LIST, ret); } return ret; } public HistoryItem getHistoryItemByName(String name) { return getHistoryItems().get(name); } public HistoryItem getHistoryItemByID(int id) { int i =0; for (HistoryItem item : getHistoryItems().values()) { if (i == id) { return item; } i++; } return null; } public HistoryItem getHistoryItemByType(HistoryType historyType) { for (HistoryItem historyItem : getHistoryItems().values()) { if (historyItem.getHistoryType().equals(historyType)) { return historyItem; } } return null; } public QueryHistoryItem addQueryHistoryItem(String name, PagedQuery query) { QueryHistoryItem item = (QueryHistoryItem) getHistoryItemByName(name); if (item == null) { item = new QueryHistoryItem(name); item.setHistoryType(HistoryType.QUERY); item.setQuery(query); getHistoryItems().put(name, item); } return item; } /* (non-Javadoc) * @see org.genedb.web.mvc.controller.HistoryManager#addHistoryItem(java.lang.String, java.util.List) */ public HistoryItem addHistoryItem(String name, HistoryType type, List<String> ids) { HistoryItem item = getHistoryItemByName(name); if (item == null) { item = new HistoryItem(name, ids); item.setHistoryType(type); getHistoryItems().put(name, item); } else { for (String id : ids) { item.addResult(id); } } return item; } /* * gv1 - added a history item without ids, but a name and type */ public HistoryItem addHistoryItem(String name, HistoryType type) { HistoryItem item = getHistoryItemByName(name); if (item == null) { item = new HistoryItem(name); item.setHistoryType(type); getHistoryItems().put(name, item); logger.info("Item has been created "); } else { logger.info("Item already there "); } logger.info(this.getHistoryItems()); logger.info(this.getHistoryItems().get(name)); return item; } public HistoryItem addHistoryItem(String name, HistoryType type,String id) { return this.addHistoryItem(name, type, Lists.newArrayList(id) ); } public HistoryItem addHistoryItem(HistoryType type, String id) { return this.addHistoryItem(type.name(), type, Lists.newArrayList(id) ); } public String getCartName() { return cartName; } public void removeItem(String name) { getHistoryItems().remove(name); } // public void removeItem(int index, int version) { // List<HistoryItem> history = getHistoryItems(); // if (version != this.version) { // throw new RuntimeException("Version mismatch"); // } // if (index < 0 || index > history.size()) { // throw new IllegalArgumentException("Index is out of range"); // } // history.remove(index); // version++; // } // public String getNextName() { // String ret = NumberNameConverter.convert(nextNumber); // nextNumber++; // return ret; // } // // public int getVersion() { // return version; // } public int getNumHistoryItems() { return getHistoryItems().size(); } @Override public String getFormalName(String name) { return name; } @Override public QueryHistoryItem getQueryHistoryItem(String name) { return (QueryHistoryItem) getHistoryItemByName(name); } }