Skip to content

Commit

Permalink
Multiple repository view graphs are correctly calculated, but there m…
Browse files Browse the repository at this point in the history
…ay still be an issue with starting up duplicate addons
  • Loading branch information
lincolnthree committed Jul 8, 2013
1 parent 6340073 commit b8a82a0
Show file tree
Hide file tree
Showing 7 changed files with 243 additions and 71 deletions.
12 changes: 10 additions & 2 deletions container-tests/pom.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jboss.forge.furnace</groupId>
Expand Down Expand Up @@ -31,8 +32,15 @@
<artifactId>arquillian-forge-classpath</artifactId>
<scope>test</scope>
</dependency>

<!-- Addons to compliment tests -->
<dependency>
<groupId>org.jboss.forge.addon</groupId>
<artifactId>addon-manager</artifactId>
<classifier>forge-addon</classifier>
<version>2.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.forge.addon</groupId>
<artifactId>example</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@
import org.jboss.forge.furnace.mocks.ServiceInterface;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
@Ignore("For some reason this works in eclipse, but not in Surefire/Maven")
@RunWith(Arquillian.class)
public class ExportedServicesMissingTest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/*
* 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.views;

import java.io.File;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import javax.inject.Inject;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.addon.manager.AddonManager;
import org.jboss.forge.addon.manager.InstallRequest;
import org.jboss.forge.arquillian.AddonDependency;
import org.jboss.forge.arquillian.Dependencies;
import org.jboss.forge.arquillian.archive.ForgeArchive;
import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.Addon;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.forge.furnace.addons.AddonRegistry;
import org.jboss.forge.furnace.lock.LockMode;
import org.jboss.forge.furnace.repositories.AddonDependencyEntry;
import org.jboss.forge.furnace.repositories.AddonRepository;
import org.jboss.forge.furnace.util.Addons;
import org.jboss.forge.furnace.versions.SingleVersion;
import org.jboss.forge.furnace.versions.SingleVersionRange;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
* FIXME This test needs to be refactored to be a bit less brittle. It breaks when addon POMs change.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
@RunWith(Arquillian.class)
public class AddonInstancesAreSingletonsTest
{
@Deployment
@Dependencies({
@AddonDependency(name = "org.jboss.forge.addon:addon-manager", version = "2.0.0-SNAPSHOT"),
@AddonDependency(name = "org.jboss.forge.addon:maven", version = "2.0.0-SNAPSHOT")
})
public static ForgeArchive getDeployment()
{
ForgeArchive archive = ShrinkWrap
.create(ForgeArchive.class)
.addBeansXML()
.addAsAddonDependencies(
AddonDependencyEntry.create("org.jboss.forge.addon:addon-manager", "2.0.0-SNAPSHOT")
);

return archive;
}

@Inject
private AddonRegistry registry;

@Inject
private AddonManager addonManager;

@Inject
private AddonRepository repository;

@Inject
private Furnace furnace;

@Test
public void testInstallingAddonWithSingleOptionalAddonDependency() throws InterruptedException, TimeoutException
{
int addonCount = registry.getAddons().size();
final AddonId exampleId = AddonId.fromCoordinates("org.jboss.forge.addon:example,2.0.0-SNAPSHOT");

/*
* Ensure that the Addon instance we receive is requested before configuration is rescanned.
*/
Addon example = furnace.getLockManager().performLocked(LockMode.WRITE, new Callable<Addon>()
{
@Override
public Addon call() throws Exception
{
InstallRequest request = addonManager.install(exampleId);
Assert.assertEquals(0, request.getRequiredAddons().size());
Assert.assertEquals(1, request.getOptionalAddons().size());
request.perform();

Assert.assertTrue(repository.isEnabled(exampleId));
Assert.assertEquals(2, repository.getAddonResources(exampleId).size());
Assert.assertTrue(repository.getAddonResources(exampleId).contains(
new File(repository.getAddonBaseDir(exampleId), "commons-lang-2.6.jar")));
Assert.assertTrue(repository.getAddonResources(exampleId).contains(
new File(repository.getAddonBaseDir(exampleId), "example-2.0.0-SNAPSHOT-forge-addon.jar")));

Set<AddonDependencyEntry> dependencies = repository.getAddonDependencies(exampleId);
Assert.assertEquals(1, dependencies.size());
AddonDependencyEntry dependency = dependencies.toArray(new AddonDependencyEntry[dependencies.size()])[0];
Assert.assertEquals("org.jboss.forge.addon:example2", dependency.getName());
Assert.assertEquals(new SingleVersionRange(new SingleVersion("2.0.0-SNAPSHOT")),
dependency.getVersionRange());
Assert.assertTrue(dependency.isOptional());
Assert.assertFalse(dependency.isExported());

Assert.assertTrue(registry.getAddon(AddonId.from("org.jboss.forge.addon:example2", "2.0.0-SNAPSHOT"))
.getStatus().isMissing());

return registry.getAddon(exampleId);
}
});
Addons.waitUntilStarted(example, 10, TimeUnit.SECONDS);
Assert.assertEquals(addonCount + 1, registry.getAddons().size());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,26 @@ public Addon getAddon(Set<AddonView> views, AddonId id)
return getAddon(views.iterator().next(), id);
}

public Set<Addon> getOrphanAddons(final AddonId id)
{
return lock.performLocked(LockMode.READ, new Callable<Set<Addon>>()
{
@Override
public Set<Addon> call() throws Exception
{
Set<Addon> result = new HashSet<Addon>();
for (Addon addon : addons)
{
if (addon.getId().equals(id) && stateManager.getViewsOf(addon).isEmpty())
{
result.add(addon);
}
}
return result;
}
});
}

public Addon getAddon(final AddonView view, final AddonId id)
{
Assert.notNull(id, "AddonId must not be null.");
Expand Down Expand Up @@ -146,8 +166,8 @@ public Void call() throws Exception

master.merge(graph);

System.out.println(" ------------ MASTER GRAPH v" + i++ + "------------ ");
System.out.println(master);
logger.log(Level.FINE, " ------------ MASTER GRAPH v" + i++ + "------------ ");
logger.log(Level.INFO, master.toString());
}

MasterGraph last = stateManager.getCurrentGraph();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,10 @@ public Void call() throws Exception
if (!shutdownRequested)
throw e;
else
{
logger.log(Level.WARNING, "Error encountered after addon startup was aborted:", e);
return Callables.returning(null);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,38 +75,60 @@ private void initGraph()

DepthFirstIterator<AddonVertex, AddonDependencyEdge> iterator = new DepthFirstIterator<AddonVertex, AddonDependencyEdge>(
graph.getGraph());

iterator.addTraversalListener(new TraversalListenerAdapter<AddonVertex, AddonDependencyEdge>()
{
@Override
public void vertexFinished(VertexTraversalEvent<AddonVertex> event)
{
AddonVertex vertex = event.getVertex();
AddonView view = vertex.getViews().iterator().next();
AddonId addonId = vertex.getAddonId();

Addon addon = null;
if (lastMasterGraph != null)
if (vertex.getAddon() == null)
{
for (AddonVertex last : lastMasterGraph.getGraph().vertexSet())
AddonView view = vertex.getViews().iterator().next();
AddonId addonId = vertex.getAddonId();

Addon addon = null;
if (lastMasterGraph != null)
{
if (last.getAddon().getId().equals(addonId) && last.getViews().contains(view))
for (AddonVertex last : lastMasterGraph.getGraph().vertexSet())
{
addon = last.getAddon();
break;
if (last.getAddon().getId().equals(addonId) && last.getViews().contains(view))
{
addon = last.getAddon();
break;
}
}
}

if (addon == null)
{

}
vertex.setAddon(addon);
}
};
});

if (addon == null)
addon = lifecycleManager.getAddon(view, addonId);
while (iterator.hasNext())
iterator.next();

iterator = new DepthFirstIterator<AddonVertex, AddonDependencyEdge>(graph.getGraph());
iterator.addTraversalListener(new TraversalListenerAdapter<AddonVertex, AddonDependencyEdge>()
{
@Override
public void vertexFinished(VertexTraversalEvent<AddonVertex> event)
{
AddonVertex vertex = event.getVertex();
if (vertex.getAddon() == null)
{
AddonView view = vertex.getViews().iterator().next();
AddonId addonId = vertex.getAddonId();

Addon addon = null;
Set<Addon> orphans = lifecycleManager.getOrphanAddons(addonId);
if (!orphans.isEmpty())
addon = orphans.iterator().next();

vertex.setAddon(addon);
if (addon == null)
addon = lifecycleManager.getAddon(view, addonId);

vertex.setAddon(addon);
}
};
});

Expand Down
Loading

0 comments on commit b8a82a0

Please sign in to comment.