added api to install plugin packages

This commit is contained in:
Sebastian Sdorra
2012-09-29 21:44:39 +02:00
parent 5c43ece689
commit a5ca1a55d2
6 changed files with 159 additions and 29 deletions

View File

@@ -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 ---------------------------------------------------------------