package org.unitils.dbmaintainer.locator.resourcepickingstrategie.impl; import java.io.IOException; import java.net.URL; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.unitils.dbmaintainer.locator.resourcepickingstrategie.ResourcePickingStrategie; /** * Implementation of the @link{ResourcePickingStrategie}. * will filter out the duplicates and will hold the most recent one. * * @author tdr * * @since 0.1.2 * */ public class UniqueMostRecentPickingStrategie implements ResourcePickingStrategie { private static Log logger = LogFactory.getLog(UniqueMostRecentPickingStrategie.class); /** * @see org.unitils.dbmaintainer.locator.resourcepickingstrategie.ResourcePickingStrategie#filter(java.util.List) */ public List<URL> filter(List<URL> resources, String resourceSearchName) { List<URL> filteredResources = new ArrayList<URL>(); for (URL url : resources) { try { addMostRecent(filteredResources, url, resourceSearchName); } catch (IOException e) { logger.error("could not add resource", e); } } return filteredResources; } /** * Will look to add the urlNew in the filteredResource. if duplicate exists (based on resourceSearchName) it will look at * last modification date and take the most recent one. * * @param filteredResources * @param urlNew * @param resourceSearchName * @throws IOException */ public void addMostRecent(List<URL> filteredResources, URL urlNew, String resourceSearchName) throws IOException { SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm"); for (int i = 0; i < filteredResources.size(); i++) { URL url = filteredResources.get(i); String endingWith = url.toString().substring(url.toString().lastIndexOf(resourceSearchName)); // logger.debug("List Resource ending with :" + endingWith); if (urlNew.toString().endsWith(endingWith)) { Long inlistresource = url.openConnection().getLastModified(); Long newresource = urlNew.openConnection().getLastModified(); if (inlistresource < newresource) { logger.debug("Resource replace by more recent after PickingStrategie: '" + url + "'(" + sdf.format(new Date(inlistresource)) + ") replaced_by '" + urlNew + "' (" + sdf.format(new Date(newresource)) + ")"); filteredResources.remove(url); filteredResources.add(urlNew); } else { logger.debug("Duplicate Resource found after PickingStrategie but not more recent (not added): '" + url + "'(" + sdf.format(new Date(inlistresource)) + ") is choosen over '" + urlNew + "' (" + sdf.format(new Date(newresource)) + ")"); } return; } } filteredResources.add(urlNew); logger.debug("Resource added after Picking Strategie " + urlNew + " "); } }