/* * Copyright 2014 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.artificer.common; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * When S-RAMP is handed content's InputStream, it needs to be read multiple times (multiple times in the * extensions, then again for persistence), some of which automatically close the stream. Further, we don't want to trust * that custom extensions will always "do the right thing" and call #reset. So, this object is passed * around throughout the process. Using a temp file, it creates on-demand streams. * * @author Brett Meyer */ public class ArtifactContent { private final String path; private final String filename; private File tempFile = null; private List<InputStream> tempStreams = new ArrayList<InputStream>(); public ArtifactContent(String path, InputStream is) throws IOException { if (path != null) { // Normalize and ensure it's a *relative* path. if (path.startsWith(File.separator)) { path = path.substring(1); } this.path = path; int index = path.lastIndexOf(File.separator); this.filename = path.substring(index + 1); } else { this.path = null; this.filename = null; } OutputStream os = null; try { tempFile = File.createTempFile(UUID.randomUUID().toString(), filename); os = FileUtils.openOutputStream(tempFile); IOUtils.copy(is, os); } catch (IOException e) { if (tempFile != null) { FileUtils.deleteQuietly(tempFile); } throw e; } finally { IOUtils.closeQuietly(is); IOUtils.closeQuietly(os); } } public ArtifactContent(String fullPath, File file) throws IOException { this(fullPath, new FileInputStream(file)); } /** * Obtain this artifact's InputStream, created on-demand. * * @return InputStream * @throws FileNotFoundException */ public InputStream getInputStream() throws FileNotFoundException { if (tempFile != null) { InputStream is = new BufferedInputStream(new FileInputStream(tempFile)); tempStreams.add(is); return is; } else { return null; } } /** * Obtain a reference to the artifact's temporary File on the filesystem. * * @return File */ public File getFile() { return tempFile; } /** * Obtain the artifact's filename. * * @return String */ public String getFilename() { return filename; } /** * Obtain the artifact's path within its original context. For example, if the artifact was expanded from an * archive or was published through a batch upload, the relative path within that context will be available here. * * @return String */ public String getPath() { return path; } public long getSize() { return tempFile.length(); } public void cleanup() { if (tempFile != null) { tempFile.delete(); tempFile = null; } for (InputStream is : tempStreams) { IOUtils.closeQuietly(is); } tempStreams = null; } }