/** * 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.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import javax.enterprise.event.Observes; import com.intuit.tank.project.BaseEntity; import com.intuit.tank.qualifier.Modified; import com.intuit.tank.util.ModifiedDateComparator; import com.intuit.tank.util.ModifiedDateComparator.SortOrder; import com.intuit.tank.view.filter.ViewFilterType; /** * EntityVersionLoader * * @author dangleton * */ public abstract class EntityVersionLoader<T extends BaseEntity, MESSAGE_TYPE> implements Serializable { private static final long serialVersionUID = 1L; private static final long MAX_VALID_TIME = 1000 * 60 * 5; // five minutes private int version; private List<T> versionEntities; private long timeStamp; /** * * @param p */ public void observeEvents(@Observes @Modified MESSAGE_TYPE p) { invalidate(); } /** * @return the users */ public VersionContainer<T> getVersionContainer(ViewFilterType viewFilter) { if (shouldReload()) { initContainer(); } return new VersionContainer<T>(getVersionEntities(viewFilter), version); } /** * @return the users */ public VersionContainer<T> getVersionContainer() { return getVersionContainer(ViewFilterType.ALL); } /** * @return the users */ public List<T> getVersionEntities() { return getVersionEntities(ViewFilterType.ALL); } /** * @return the users */ public List<T> getVersionEntities(ViewFilterType viewFilter) { if (shouldReload()) { initContainer(); } return filterEntities(versionEntities, viewFilter); } public boolean isCurrent(int version) { try { return version == this.version; } catch (Exception e) { // slim possibility of this happening in a race condition. Easier to let it fail and reload than synchronize } return false; } private boolean shouldReload() { return versionEntities == null || System.currentTimeMillis() > timeStamp + MAX_VALID_TIME; } /** * */ protected void invalidate() { // this.versionContainer = null; this.versionEntities = null; this.version++; } /** * @return the */ private synchronized void initContainer() { versionEntities = getEntities(); this.version++; // versionContainer = new VersionContainer<T>(versionEntities, version); timeStamp = System.currentTimeMillis(); } /** * Filters loaded entities based on viewFilter * * @param entityList * - list of entities to filter * @param viewFilter * - filter criteria * @return List of T that satisfy the filter condition */ private List<T> filterEntities(List<T> entityList, ViewFilterType viewFilter) { if (viewFilter == ViewFilterType.ALL) { return entityList; } List<T> ret = new ArrayList<T>(); Date d = ViewFilterType.getViewFilterDate(viewFilter); for (T entity : entityList) { if (entity.getCreated().after(d)) { ret.add(entity); } } Collections.sort(ret, new ModifiedDateComparator(SortOrder.DESCENDING)); return ret; } /** * Return a list of Entities that this VersionLoader deals with * * @return */ protected abstract List<T> getEntities(); }