mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-06 05:25:44 +01:00
added api to install plugin packages
This commit is contained in:
@@ -35,6 +35,8 @@ package sonia.scm.plugin;
|
||||
|
||||
//~--- non-JDK imports --------------------------------------------------------
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.io.Files;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
import com.google.inject.Singleton;
|
||||
@@ -49,6 +51,7 @@ import sonia.scm.SCMContextProvider;
|
||||
import sonia.scm.cache.Cache;
|
||||
import sonia.scm.cache.CacheManager;
|
||||
import sonia.scm.config.ScmConfiguration;
|
||||
import sonia.scm.io.ZipUnArchiver;
|
||||
import sonia.scm.net.HttpClient;
|
||||
import sonia.scm.security.SecurityContext;
|
||||
import sonia.scm.util.AssertUtil;
|
||||
@@ -59,6 +62,8 @@ import sonia.scm.util.Util;
|
||||
|
||||
//~--- JDK imports ------------------------------------------------------------
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
@@ -72,6 +77,7 @@ import java.util.LinkedHashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.xml.bind.JAXB;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
@@ -82,7 +88,7 @@ import javax.xml.bind.Unmarshaller;
|
||||
*/
|
||||
@Singleton
|
||||
public class DefaultPluginManager
|
||||
implements PluginManager, ConfigChangedListener<ScmConfiguration>
|
||||
implements PluginManager, ConfigChangedListener<ScmConfiguration>
|
||||
{
|
||||
|
||||
/** Field description */
|
||||
@@ -116,17 +122,16 @@ public class DefaultPluginManager
|
||||
* @param clientProvider
|
||||
*/
|
||||
@Inject
|
||||
public DefaultPluginManager(
|
||||
SCMContextProvider context,
|
||||
Provider<SecurityContext> securityContextProvicer,
|
||||
ScmConfiguration configuration, PluginLoader pluginLoader,
|
||||
CacheManager cacheManager, Provider<HttpClient> clientProvider)
|
||||
public DefaultPluginManager(SCMContextProvider context,
|
||||
Provider<SecurityContext> securityContextProvicer,
|
||||
ScmConfiguration configuration, PluginLoader pluginLoader,
|
||||
CacheManager cacheManager, Provider<HttpClient> clientProvider)
|
||||
{
|
||||
this.context = context;
|
||||
this.securityContextProvicer = securityContextProvicer;
|
||||
this.configuration = configuration;
|
||||
this.cache = cacheManager.getCache(String.class, PluginCenter.class,
|
||||
CACHE_NAME);
|
||||
CACHE_NAME);
|
||||
this.clientProvider = clientProvider;
|
||||
installedPlugins = new HashMap<String, Plugin>();
|
||||
|
||||
@@ -214,6 +219,50 @@ public class DefaultPluginManager
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method description
|
||||
*
|
||||
*
|
||||
* @param packageStream
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
@Override
|
||||
public void installPackage(InputStream packageStream) throws IOException
|
||||
{
|
||||
SecurityUtil.assertIsAdmin(securityContextProvicer);
|
||||
|
||||
File tempDirectory = Files.createTempDir();
|
||||
|
||||
try
|
||||
{
|
||||
new ZipUnArchiver().extractArchive(packageStream, tempDirectory);
|
||||
|
||||
Plugin plugin = JAXB.unmarshal(new File(tempDirectory, "plugin.xml"),
|
||||
Plugin.class);
|
||||
|
||||
// TODO check conditions
|
||||
|
||||
|
||||
AetherPluginHandler aph = new AetherPluginHandler(this, context,
|
||||
configuration);
|
||||
Collection<PluginRepository> repositories =
|
||||
Sets.newHashSet(new PluginRepository("package-repository",
|
||||
"file://".concat(tempDirectory.getAbsolutePath())));
|
||||
|
||||
aph.setPluginRepositories(repositories);
|
||||
|
||||
aph.install(plugin.getInformation().getId());
|
||||
plugin.getInformation().setState(PluginState.INSTALLED);
|
||||
installedPlugins.put(plugin.getInformation().getId(), plugin);
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
IOUtil.delete(tempDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method description
|
||||
*
|
||||
@@ -277,7 +326,7 @@ public class DefaultPluginManager
|
||||
for (PluginInformation info : getInstalled())
|
||||
{
|
||||
if (groupId.equals(info.getGroupId())
|
||||
&& artefactId.equals(info.getArtifactId()))
|
||||
&& artefactId.equals(info.getArtifactId()))
|
||||
{
|
||||
installed = info;
|
||||
|
||||
@@ -453,7 +502,7 @@ public class DefaultPluginManager
|
||||
}
|
||||
|
||||
return url.replace("{version}", context.getVersion()).replace("{os}",
|
||||
os).replace("{arch}", arch);
|
||||
os).replace("{arch}", arch);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -465,7 +514,7 @@ public class DefaultPluginManager
|
||||
* @param filter
|
||||
*/
|
||||
private void filter(Set<PluginInformation> target,
|
||||
Collection<PluginInformation> source, PluginFilter filter)
|
||||
Collection<PluginInformation> source, PluginFilter filter)
|
||||
{
|
||||
for (PluginInformation info : source)
|
||||
{
|
||||
@@ -588,7 +637,7 @@ public class DefaultPluginManager
|
||||
if (pluginHandler == null)
|
||||
{
|
||||
pluginHandler = new AetherPluginHandler(this,
|
||||
SCMContext.getContext(), configuration);
|
||||
SCMContext.getContext(), configuration);
|
||||
}
|
||||
|
||||
pluginHandler.setPluginRepositories(center.getRepositories());
|
||||
@@ -643,7 +692,7 @@ public class DefaultPluginManager
|
||||
PluginInformation installed = installedPlugin.getInformation();
|
||||
|
||||
if (isSamePlugin(available, installed)
|
||||
&& (installed.getState() == PluginState.CORE))
|
||||
&& (installed.getState() == PluginState.CORE))
|
||||
{
|
||||
core = true;
|
||||
|
||||
@@ -664,7 +713,7 @@ public class DefaultPluginManager
|
||||
* @return
|
||||
*/
|
||||
private boolean isNewer(PluginInformation available,
|
||||
PluginInformation installed)
|
||||
PluginInformation installed)
|
||||
{
|
||||
boolean result = false;
|
||||
PluginVersion version = PluginVersion.createVersion(available.getVersion());
|
||||
@@ -689,7 +738,7 @@ public class DefaultPluginManager
|
||||
private boolean isSamePlugin(PluginInformation p1, PluginInformation p2)
|
||||
{
|
||||
return p1.getGroupId().equals(p2.getGroupId())
|
||||
&& p1.getArtifactId().equals(p2.getArtifactId());
|
||||
&& p1.getArtifactId().equals(p2.getArtifactId());
|
||||
}
|
||||
|
||||
//~--- fields ---------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user