/*************************GO-LICENSE-START*********************************
* Copyright 2014 ThoughtWorks, 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.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.plugin.infra.plugininfo;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import com.thoughtworks.go.util.FileUtil;
import com.thoughtworks.go.util.SystemEnvironment;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static com.thoughtworks.go.util.SystemEnvironment.PLUGIN_BUNDLE_PATH;
@Component
public class GoPluginDescriptorBuilder {
private static final Logger LOGGER = Logger.getLogger(GoPluginDescriptorBuilder.class);
private static final String PLUGIN_XML = "plugin.xml";
private SystemEnvironment systemEnvironment;
private File bundlePathLocation;
protected GoPluginDescriptorBuilder() {
this.systemEnvironment = new SystemEnvironment();
bundlePathLocation = bundlePath();
}
@Autowired
public GoPluginDescriptorBuilder(SystemEnvironment systemEnvironment) {
this.systemEnvironment = systemEnvironment;
bundlePathLocation = bundlePath();
}
public GoPluginDescriptor build(File pluginJarFile, boolean isBundledPlugin) {
if (!pluginJarFile.exists()) {
throw new RuntimeException(String.format("Plugin jar does not exist: %s", pluginJarFile.getAbsoluteFile()));
}
InputStream pluginXMLStream = null;
JarFile jarFile = null;
try {
jarFile = new JarFile(pluginJarFile);
ZipEntry entry = jarFile.getEntry(PLUGIN_XML);
if (entry == null) {
return GoPluginDescriptor.usingId(pluginJarFile.getName(), pluginJarFile.getAbsolutePath(), getBundleLocation(bundlePathLocation, pluginJarFile.getName()), isBundledPlugin);
}
pluginXMLStream = jarFile.getInputStream(entry);
return GoPluginDescriptorParser.parseXML(pluginXMLStream, pluginJarFile.getAbsolutePath(), getBundleLocation(bundlePathLocation, pluginJarFile.getName()), isBundledPlugin);
} catch (Exception e) {
LOGGER.warn("Could not load plugin with jar filename:" + pluginJarFile.getName(), e);
String cause = e.getCause() != null ? String.format("%s. Cause: %s", e.getMessage(), e.getCause().getMessage()) : e.getMessage();
return GoPluginDescriptor.usingId(pluginJarFile.getName(), pluginJarFile.getAbsolutePath(), getBundleLocation(bundlePathLocation, pluginJarFile.getName()), isBundledPlugin)
.markAsInvalid(Arrays.asList(String.format("Plugin with ID (%s) is not valid: %s", pluginJarFile.getName(), cause)), e);
} finally {
IOUtils.closeQuietly(pluginXMLStream);
closeQuietly(jarFile);
}
}
private void closeQuietly(JarFile jarFile) {
if (jarFile != null) {
try {
jarFile.close();
} catch (IOException e) {
//ignore
}
}
}
private File getBundleLocation(File bundleDirectory, String name) {
return new File(bundleDirectory, name);
}
File bundlePath() {
File bundleDir = new File(systemEnvironment.get(PLUGIN_BUNDLE_PATH));
FileUtil.validateAndCreateDirectory(bundleDir);
return bundleDir;
}
}