/* (c) 2015 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.jdbcstore.cache; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.io.IOUtils; import org.geoserver.platform.resource.Resource; import org.geoserver.platform.resource.Resource.Type; /** * Basic implementation for Resource Cache. * * @author Kevin Smith, Boundless * @author Niels Charlier * */ public class SimpleResourceCache implements ResourceCache { File base; boolean cacheChildren = true; public SimpleResourceCache() { } public SimpleResourceCache(File base) { this.base=base; } public File getBase() { return base; } public void setBase(File base) { this.base = base; } public boolean isCacheChildren() { return cacheChildren; } public void setCacheChildren(boolean cacheChildren) { this.cacheChildren = cacheChildren; } void cacheData(Resource res, File file) throws IOException { assert res.getType()==Type.RESOURCE; try (OutputStream out = new FileOutputStream(file)) { try (InputStream in = res.in()) { IOUtils.copy(in, out); } } } void cacheChildren(Resource res, File file) throws IOException { assert res.getType()==Type.DIRECTORY; for (Resource child : res.list()) { cache(child, false); }; } @Override public File cache(Resource res, boolean createDirectory) throws IOException { String path = res.path(); long mtime = res.lastmodified(); File cached = new File(base, path); if(!cached.exists() || cached.lastModified()<mtime) { Resource.Type type = res.getType(); switch (type) { case RESOURCE: cached.getParentFile().mkdirs(); cacheData(res, cached); break; case DIRECTORY: cached.mkdirs(); if (cacheChildren) { cacheChildren(res, cached); } break; case UNDEFINED: if (createDirectory) { cached.mkdirs(); } else { cached.getParentFile().mkdirs(); } break; } } return cached; } }