All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.analyst.DiskBackedPointSetCache Maven / Gradle / Ivy

There is a newer version: 2.6.0
Show newest version
package org.opentripplanner.analyst;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class DiskBackedPointSetCache extends PointSetCache {
	
	private static final Logger LOG = LoggerFactory.getLogger(DiskBackedPointSetCache.class);

	protected File pointSetPath;
	
	protected class PointSetLoader extends CacheLoader {
	
		@Override
		public PointSet load(String pointSetId) throws Exception {
			if (pointSetPath != null && ! (pointSetPath.isDirectory() && pointSetPath.canRead())) {
                LOG.error("'{}' is not a readable directory.", pointSetPath);
                return null;
            }
    		for (File file : pointSetPath.listFiles()) {
                if(file.getName().toLowerCase().startsWith(pointSetId.toLowerCase())) {
					LOG.info("Attempting to load pointset from '{}'.", file);
                	PointSet pointSet = this.loadFromFile(file);
                	if(pointSet == null) {
						LOG.error("Pointset loading function returned null.");
						return null;
					} else {
                		return pointSet;
					}
                }
            }
			LOG.error("No file was found with the given pointset name.");
			return null;
		}
		
		public PointSet loadFromFile(File pointSetData) {
			
			String name = pointSetData.getName();
			
			if (name.endsWith(".csv")) {
	            String baseName = name.substring(0, name.length() - 4);
	            LOG.info("loading '{}' with ID '{}'", pointSetData, baseName);
	            try {
	                PointSet pset = PointSet.fromCsv(pointSetData);
	                if (pset == null) {
	                    LOG.warn("Failure, skipping this pointset.");
	                }
	                
	                return pset;
	                
	            } catch (IOException ioex) {
	                LOG.warn("Exception while loading pointset.", ioex);
	            }
	        } else if (name.endsWith(".json")) {
	            String baseName = name.substring(0, name.length() - 5);
	            LOG.info("loading '{}' with ID '{}'", pointSetData, baseName);
	            PointSet pset = PointSet.fromGeoJson(pointSetData);
	            if (pset == null) {
	                LOG.warn("Failure, skipping this pointset.");
	            }       	            
	            return pset;
	        }
			return null;
		}
	}

	public DiskBackedPointSetCache(Integer maxCacheSize, File pointSetPath) {
		super();
		
		this.pointSetPath = pointSetPath;
		
		// TODO could convert to a weight-based eviction strategy based on pointset size
		this.pointSets = CacheBuilder.newBuilder()
			       .maximumSize(maxCacheSize)
			       .build(new PointSetLoader());
		
	}

	@Override
	public ArrayList getPointSetIds() {
		
		ArrayList ids = new ArrayList();
		
		for(File f : pointSetPath.listFiles()) {
			String name = f.getName();
			
			if (name.endsWith(".csv")) {
	            String baseName = name.substring(0, name.length() - 4);
	            ids.add(baseName);
			}
			else if (name.endsWith(".json")) {
		        String baseName = name.substring(0, name.length() - 5);
		        ids.add(baseName);
			}
		}

		return ids;
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy