Skip to content

Commit

Permalink
FORGE-1038: Fixed update bug when addon is in an immutable repository
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Jul 25, 2013
1 parent f509270 commit 52a212a
Show file tree
Hide file tree
Showing 3 changed files with 180 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
import static org.jboss.forge.furnace.manager.impl.request.AddonActionRequestFactory.createUpdateRequest;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.Map.Entry;

import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.AddonId;
Expand Down Expand Up @@ -82,7 +82,7 @@ public InstallRequest install(final AddonId addonId, final AddonRepository repos
AddonInfo addonInfo = info(addonId);
List<AddonInfo> allAddons = new LinkedList<AddonInfo>();
collectRequiredAddons(addonInfo, allAddons);
Set<AddonId> installedAddonIds = getInstalledAddons();
Map<AddonId, AddonRepository> installedAddonIds = getInstalledAddons();
List<AddonActionRequest> actions = new ArrayList<AddonActionRequest>();
for (AddonInfo newAddonInfo : allAddons)
{
Expand Down Expand Up @@ -156,16 +156,24 @@ public EnableRequest enable(final AddonId id, final AddonRepository repository)
* @return
*/
private AddonActionRequest createRequest(final AddonInfo addonInfo, final MutableAddonRepository repository,
final Collection<AddonId> installedAddons)
final Map<AddonId, AddonRepository> installedAddons)
{
final AddonActionRequest request;
AddonId addon = addonInfo.getAddon();
if (installedAddons.contains(addon))
if (installedAddons.containsKey(addon))
{
// Already contains the installed addon. Update ONLY if the version is SNAPSHOT
if (Versions.isSnapshot(addonInfo.getAddon().getVersion()) && updateSnapshotDependencies)
{
request = createUpdateRequest(addonInfo, addonInfo, repository, furnace);
AddonRepository addonRepository = installedAddons.get(addon);
if (repository.equals(addonRepository))
{
request = createUpdateRequest(addonInfo, addonInfo, repository, furnace);
}
else
{
request = createDeployRequest(addonInfo, repository, furnace);
}
}
else
{
Expand All @@ -174,21 +182,29 @@ private AddonActionRequest createRequest(final AddonInfo addonInfo, final Mutabl
}
else
{
AddonId differentVersion = null;
for (AddonId addonId : installedAddons)
Entry<AddonId, AddonRepository> differentVersionEntry = null;
for (Entry<AddonId, AddonRepository> addonEntry : installedAddons.entrySet())
{
AddonId addonId = addonEntry.getKey();
if (addonId.getName().equals(addon.getName()))
{
differentVersion = addonId;
differentVersionEntry = addonEntry;
break;
}
}
if (differentVersion != null)
if (differentVersionEntry != null)
{
// TODO: Use Lincoln's new Version/Versions class
if (differentVersion.getVersion().toString().compareTo(addon.getVersion().toString()) < 0)
if (differentVersionEntry.getKey().getVersion().toString().compareTo(addon.getVersion().toString()) < 0)
{
request = createUpdateRequest(info(differentVersion), addonInfo, repository, furnace);
if (repository.equals(differentVersionEntry.getValue()))
{
request = createUpdateRequest(info(differentVersionEntry.getKey()), addonInfo, repository, furnace);
}
else
{
request = createDeployRequest(addonInfo, repository, furnace);
}
}
else
{
Expand Down Expand Up @@ -243,14 +259,21 @@ private MutableAddonRepository assertMutableRepository(AddonRepository repositor
return (MutableAddonRepository) repository;
}

private Set<AddonId> getInstalledAddons()
/**
* Returns a {@link Map} of the installed addons with the key as the {@link AddonId} and the value as an
* {@link AddonRepository} indicating which repository is it from
*/
private Map<AddonId, AddonRepository> getInstalledAddons()
{
Set<AddonId> addons = new HashSet<AddonId>();
Map<AddonId, AddonRepository> addons = new HashMap<AddonId, AddonRepository>();
for (AddonRepository repository : furnace.getRepositories())
{
addons.addAll(repository.listEnabled());
List<AddonId> listEnabled = repository.listEnabled();
for (AddonId addonId : listEnabled)
{
addons.put(addonId, repository);
}
}
return addons;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ServiceLoader;

import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.forge.furnace.impl.FurnaceImpl;
import org.jboss.forge.furnace.impl.util.Files;
import org.jboss.forge.furnace.manager.impl.AddonManagerImpl;
import org.jboss.forge.furnace.manager.maven.MavenContainer;
Expand Down Expand Up @@ -70,7 +70,7 @@ public static void clearRemoteRepository()
@Before
public void setUp() throws IOException
{
furnace = ServiceLoader.load(Furnace.class).iterator().next();
furnace = new FurnaceImpl();
resolver = new MavenAddonDependencyResolver();
repository = File.createTempFile("furnace-repo", ".tmp");
repository.delete();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.furnace.manager.impl;

import static org.hamcrest.CoreMatchers.everyItem;
import static org.hamcrest.CoreMatchers.isA;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.List;

import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.forge.furnace.impl.FurnaceImpl;
import org.jboss.forge.furnace.impl.util.Files;
import org.jboss.forge.furnace.manager.maven.MavenContainer;
import org.jboss.forge.furnace.manager.maven.addon.MavenAddonDependencyResolver;
import org.jboss.forge.furnace.manager.request.AddonActionRequest;
import org.jboss.forge.furnace.manager.request.DeployRequest;
import org.jboss.forge.furnace.manager.request.InstallRequest;
import org.jboss.forge.furnace.repositories.AddonRepository;
import org.jboss.forge.furnace.repositories.AddonRepositoryMode;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
* Tests that depend on real addons
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*
*/
public class AddonManagerRepositoryTest
{

private Furnace furnace;
private AddonManagerImpl addonManager;
private AddonRepository mutable;
private AddonRepository immutable;

@BeforeClass
public static void setRemoteRepository() throws IOException
{
System.setProperty(MavenContainer.ALT_USER_SETTINGS_XML_LOCATION, getAbsolutePath("profiles/settings.xml"));
System.setProperty(MavenContainer.ALT_LOCAL_REPOSITORY_LOCATION, "target/the-other-repository");
}

private static String getAbsolutePath(String path) throws FileNotFoundException
{
URL resource = Thread.currentThread().getContextClassLoader().getResource(path);
if (resource == null)
throw new FileNotFoundException(path);
return resource.getFile();
}

@AfterClass
public static void clearRemoteRepository()
{
System.clearProperty(MavenContainer.ALT_USER_SETTINGS_XML_LOCATION);
System.clearProperty(MavenContainer.ALT_LOCAL_REPOSITORY_LOCATION);
}

@Before
public void setUp() throws IOException
{
furnace = new FurnaceImpl();
mutable = registerTempRepository(furnace, AddonRepositoryMode.MUTABLE);
immutable = registerTempRepository(furnace, AddonRepositoryMode.IMMUTABLE);
addonManager = new AddonManagerImpl(furnace, new MavenAddonDependencyResolver());
}

private static AddonRepository registerTempRepository(Furnace furnace, AddonRepositoryMode mode) throws IOException
{
File repository = File.createTempFile("furnace-repo", ".tmp");
repository.delete();
repository.mkdir();
return furnace.addRepository(mode, repository);
}

/**
* Hack to deploy addon in an immutable repository
*/
private static void deployAddonInImmutableRepository(AddonId addonId, AddonRepository repository)
{
Furnace furnace = new FurnaceImpl();
furnace.addRepository(AddonRepositoryMode.MUTABLE, repository.getRootDirectory());
AddonManagerImpl addonManager = new AddonManagerImpl(furnace, new MavenAddonDependencyResolver());
addonManager.deploy(addonId).perform();
}

@After
public void tearDown()
{
if (immutable != null)
{
File rootDirectory = immutable.getRootDirectory();
if (!Files.delete(rootDirectory, true))
{
System.err.println("Could not delete " + rootDirectory);
rootDirectory.deleteOnExit();
}
}
if (mutable != null)
{
File rootDirectory = mutable.getRootDirectory();
if (!Files.delete(rootDirectory, true))
{
System.err.println("Could not delete " + rootDirectory);
rootDirectory.deleteOnExit();
}
}
}

@SuppressWarnings("unchecked")
@Test
public void testUpdateOnImmutableRepository() throws Exception
{
AddonId no_dep = AddonId.from("test:no_dep", "1.0.0.Final");
AddonId no_dep_newer = AddonId.from("test:no_dep", "1.0.1.Final");

// Adding an addon in a immutable repo
deployAddonInImmutableRepository(no_dep, immutable);
InstallRequest newer = addonManager.install(no_dep_newer);
List<? extends AddonActionRequest> actions = newer.getActions();
Assert.assertEquals(1, actions.size());
Assert.assertThat((List<DeployRequest>) actions, everyItem(isA(DeployRequest.class)));
}
}

0 comments on commit 52a212a

Please sign in to comment.