/* * Copyright 2010 * Ubiquitous Knowledge Processing (UKP) Lab * Technische Universität Darmstadt * * 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 de.tudarmstadt.ukp.dkpro.core.api.resources; import static de.tudarmstadt.ukp.dkpro.core.api.resources.ResourceUtils.resolveLocation; import static org.apache.commons.io.IOUtils.closeQuietly; 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.net.URL; import java.util.Properties; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.springframework.core.io.UrlResource; import org.springframework.core.io.support.PropertiesLoaderUtils; /** * Provides temporary installation of binaries from the classpath to the local file system. * */ public class RuntimeProvider { public static final String MODE_EXECUTABLE = "executable"; private boolean installed; private File workspace; private String baseLocation; private String platform; public RuntimeProvider(String aBaseLocation) { setBaseLocation(aBaseLocation); platform = new PlatformDetector().getPlatformId(); } public void setBaseLocation(String aBaseLocation) { baseLocation = aBaseLocation; } public Properties getManifest() throws IOException { String mfl = baseLocation; if (!mfl.endsWith("/")) { mfl += "/"; } URL manifestUrl = resolveLocation(baseLocation + platform + "/manifest.properties", this, null); return PropertiesLoaderUtils.loadProperties(new UrlResource(manifestUrl)); } public boolean isInstalled() { return installed; } public File getFile(String aFilename) throws IOException { install(); File file = new File(getWorkspace(), aFilename); if (!file.exists()) { throw new FileNotFoundException("File not found in workspace: ["+aFilename+"]"); } return file; } public File getWorkspace() throws IOException { if (workspace == null) { workspace = File.createTempFile("dkpro", "runtime"); FileUtils.forceDelete(workspace); FileUtils.forceMkdir(workspace); workspace.deleteOnExit(); } return workspace; } public void install() throws IOException { if (installed) { return; } Properties manifest = getManifest(); for (String filename : manifest.stringPropertyNames()) { URL source = resolveLocation(baseLocation+platform + "/" + filename, this, null); File target = new File(getWorkspace(), filename); InputStream is = null; OutputStream os = null; try { is = source.openStream(); os = new FileOutputStream(target); IOUtils.copyLarge(is, os); } finally { closeQuietly(is); closeQuietly(os); } if (MODE_EXECUTABLE.equals(manifest.getProperty(filename))) { target.setExecutable(true); } target.deleteOnExit(); } installed = true; } public void uninstall() { if (workspace != null) { FileUtils.deleteQuietly(workspace); workspace = null; installed = false; } } @Override protected void finalize() throws Throwable { uninstall(); } }