From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001 From: Paul Martin <paul@paulsputer.com> Date: Sat, 30 Apr 2016 04:19:14 -0400 Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates --- src/main/java/com/gitblit/manager/PluginManager.java | 109 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 72 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/gitblit/manager/PluginManager.java b/src/main/java/com/gitblit/manager/PluginManager.java index 874e24b..b3936e5 100644 --- a/src/main/java/com/gitblit/manager/PluginManager.java +++ b/src/main/java/com/gitblit/manager/PluginManager.java @@ -15,13 +15,15 @@ */ package com.gitblit.manager; -import java.io.BufferedInputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.net.HttpURLConnection; +import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.net.URLConnection; @@ -37,10 +39,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ro.fortsoft.pf4j.DefaultExtensionFinder; +import ro.fortsoft.pf4j.DefaultPluginFactory; import ro.fortsoft.pf4j.DefaultPluginManager; -import ro.fortsoft.pf4j.ExtensionFinder; +import ro.fortsoft.pf4j.ExtensionFactory; +import ro.fortsoft.pf4j.Plugin; import ro.fortsoft.pf4j.PluginClassLoader; +import ro.fortsoft.pf4j.PluginFactory; import ro.fortsoft.pf4j.PluginState; import ro.fortsoft.pf4j.PluginStateEvent; import ro.fortsoft.pf4j.PluginStateListener; @@ -58,8 +62,7 @@ import com.gitblit.utils.FileUtils; import com.gitblit.utils.JsonUtils; import com.gitblit.utils.StringUtils; -import com.google.common.io.Files; -import com.google.common.io.InputSupplier; +import com.google.common.io.ByteStreams; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -105,32 +108,18 @@ public PluginManager start() { File dir = runtimeManager.getFileOrFolder(Keys.plugins.folder, "${baseFolder}/plugins"); dir.mkdirs(); + pf4j = new DefaultPluginManager(dir) { + @Override - protected ExtensionFinder createExtensionFinder() { - DefaultExtensionFinder extensionFinder = new DefaultExtensionFinder(this) { - @Override - protected ExtensionFactory createExtensionFactory() { - return new ExtensionFactory() { - @Override - public Object create(Class<?> extensionType) { - // instantiate && inject the extension - logger.debug("Create instance for extension '{}'", extensionType.getName()); - try { - return runtimeManager.getInjector().getInstance(extensionType); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - return null; - } + protected PluginFactory createPluginFactory() { + return new GuicePluginFactory(); + } - }; - } - }; - addPluginStateListener(extensionFinder); - - return extensionFinder; - } + @Override + protected ExtensionFactory createExtensionFactory() { + return new GuiceExtensionFactory(); + } }; try { @@ -452,6 +441,10 @@ protected File download(String url, boolean verifyChecksum) throws IOException { File file = downloadFile(url); + if (!verifyChecksum) { + return file; + } + File sha1File = null; try { sha1File = downloadFile(url + ".sha1"); @@ -465,7 +458,7 @@ } - if (sha1File == null && md5File == null && verifyChecksum) { + if (sha1File == null && md5File == null) { throw new IOException("Missing SHA1 and MD5 checksums for " + url); } @@ -540,12 +533,9 @@ // try to get the server-specified last-modified date of this artifact long lastModified = conn.getHeaderFieldDate("Last-Modified", System.currentTimeMillis()); - Files.copy(new InputSupplier<InputStream>() { - @Override - public InputStream getInput() throws IOException { - return new BufferedInputStream(conn.getInputStream()); - } - }, tmpFile); + try (InputStream is = conn.getInputStream(); OutputStream os = new FileOutputStream(tmpFile);) { + ByteStreams.copy(is, os); + } File destFile = new File(pFolder, StringUtils.getLastPathElement(u.getPath())); if (destFile.exists()) { @@ -594,10 +584,55 @@ } protected Proxy getProxy(URL url) { - return java.net.Proxy.NO_PROXY; + String proxyHost = runtimeManager.getSettings().getString(Keys.plugins.httpProxyHost, ""); + String proxyPort = runtimeManager.getSettings().getString(Keys.plugins.httpProxyPort, ""); + + if (!StringUtils.isEmpty(proxyHost) && !StringUtils.isEmpty(proxyPort)) { + return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort))); + } else { + return java.net.Proxy.NO_PROXY; + } } protected String getProxyAuthorization(URL url) { - return ""; + String proxyAuth = runtimeManager.getSettings().getString(Keys.plugins.httpProxyAuthorization, ""); + return proxyAuth; + } + + /** + * Instantiates a plugin using pf4j but injects member fields + * with Guice. + */ + private class GuicePluginFactory extends DefaultPluginFactory { + + @Override + public Plugin create(PluginWrapper pluginWrapper) { + // use pf4j to create the plugin + Plugin plugin = super.create(pluginWrapper); + + if (plugin != null) { + // allow Guice to inject member fields + runtimeManager.getInjector().injectMembers(plugin); + } + + return plugin; + } + } + + /** + * Instantiates an extension using Guice. + */ + private class GuiceExtensionFactory implements ExtensionFactory { + @Override + public Object create(Class<?> extensionClass) { + // instantiate && inject the extension + logger.debug("Create instance for extension '{}'", extensionClass.getName()); + try { + return runtimeManager.getInjector().getInstance(extensionClass); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } } } -- Gitblit v1.9.1