package org.concordion.internal; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import org.concordion.api.Resource; import org.concordion.api.Target; import org.concordion.internal.util.Check; import org.concordion.internal.util.IOUtil; public class FileTarget implements Target { private static final long FRESH_ENOUGH_MILLIS = 2000; // 2 secs private final File baseDir; public FileTarget(File baseDir) { this.baseDir = baseDir; } public void copyTo(Resource resource, InputStream inputStream) throws IOException { Check.notNull(resource, "resource is null"); mkdirs(resource); File outputFile = getFile(resource); // Do not overwrite if a recent copy already exists if (outputFile.exists() && isFreshEnough(outputFile)) { return; } IOUtil.copy(inputStream, getOutputStream(resource)); } public void delete(Resource resource) throws IOException { Check.notNull(resource, "resource is null"); getFile(resource).delete(); } public void write(Resource resource, String s) throws IOException { Check.notNull(resource, "resource is null"); mkdirs(resource); Writer writer = new BufferedWriter(createWriter(resource, "UTF-8")); try { writer.write(s); } finally { writer.close(); } } private OutputStreamWriter createWriter(Resource resource, String encoding) throws IOException { return new OutputStreamWriter(new FileOutputStream(getFile(resource)), encoding); } public File getFile(Resource resource) { return new File(baseDir, resource.getPath()); } private OutputStream getOutputStream(Resource resource) throws FileNotFoundException { return new FileOutputStream(getFile(resource)); } private void mkdirs(Resource resource) throws IOException { File dir = getFile(resource).getParentFile(); dir.mkdirs(); } private boolean isFreshEnough(File outputFile) { long ageInMillis = Math.abs(outputFile.lastModified() - System.currentTimeMillis()); return ageInMillis < FRESH_ENOUGH_MILLIS; } }