/** * *************************************************************************** * Copyright (c) 2010 Qcadoo Limited * Project: Qcadoo Framework * Version: 1.4 * * This file is part of Qcadoo. * * Qcadoo is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *************************************************************************** */ package com.qcadoo.plugin.internal.filemanager; import static java.lang.System.getProperty; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.qcadoo.plugin.api.artifact.PluginArtifact; import com.qcadoo.plugin.internal.PluginException; import com.qcadoo.plugin.internal.api.PluginFileManager; @Service public final class DefaultPluginFileManager implements PluginFileManager { private static final String L_FILE_SEPARATOR = "file.separator"; private static final Logger LOG = LoggerFactory.getLogger(DefaultPluginFileManager.class); @Value("#{plugin.pluginsPath}") private String pluginsPath; @Value("#{plugin.pluginsTmpPath}") private String pluginsTmpPath; @Override public boolean installPlugin(final String... filenames) { if (!checkFileRightsToWrite(pluginsPath)) { return false; } for (String filename : filenames) { if (!checkFileExists(filename, pluginsTmpPath)) { return false; } } for (String filename : filenames) { try { FileUtils.moveToDirectory(new File(pluginsTmpPath + getProperty(L_FILE_SEPARATOR) + filename), new File( pluginsPath), false); } catch (IOException e) { LOG.error("Problem with moving plugin file - " + e.getMessage()); throw new PluginException(e.getMessage(), e); } } return true; } @Override public File uploadPlugin(final PluginArtifact pluginArtifact) { InputStream input = pluginArtifact.getInputStream(); File pluginFile = new File(pluginsTmpPath + getProperty(L_FILE_SEPARATOR) + pluginArtifact.getName()); try { FileUtils.copyInputStreamToFile(input, pluginFile); } catch (IOException e) { LOG.error("Problem with upload plugin file - " + e.getMessage()); throw new PluginException(e.getMessage(), e); } return pluginFile; } @Override public void uninstallPlugin(final String... filenames) { for (String filename : filenames) { File file = new File((pluginsTmpPath + getProperty(L_FILE_SEPARATOR) + filename)); if (!file.exists()) { file = new File(pluginsPath + getProperty(L_FILE_SEPARATOR) + filename); } try { FileUtils.forceDelete(file); } catch (IOException e) { LOG.error("Problem with removing plugin file - " + e.getMessage()); if (file.exists()) { LOG.info("Trying delete file after JVM stop"); file.deleteOnExit(); } } } } private boolean checkFileExists(final String key, final String path) { File file = new File(path + getProperty(L_FILE_SEPARATOR) + key); if (!file.exists()) { return false; } return true; } private boolean checkFileRightsToWrite(final String pluginsPath) { File file = new File(pluginsPath); if (!file.exists() || !file.canWrite()) { return false; } return true; } void setPluginsPath(final String pluginsPath) { this.pluginsPath = pluginsPath; } void setPluginsTmpPath(final String pluginsTmpPath) { this.pluginsTmpPath = pluginsTmpPath; } }