diff --git a/configuration/addon/pom.xml b/configuration/addon/pom.xml
index 8e93945b7c..1d2f52c439 100644
--- a/configuration/addon/pom.xml
+++ b/configuration/addon/pom.xml
@@ -31,6 +31,12 @@
forge-addon
true
+
+ org.jboss.forge.addon
+ shell
+ forge-addon
+ true
+
org.jboss.forge.furnace.container
diff --git a/configuration/impl/pom.xml b/configuration/impl/pom.xml
index f054511f8a..d3088581d2 100644
--- a/configuration/impl/pom.xml
+++ b/configuration/impl/pom.xml
@@ -14,7 +14,12 @@
cdi-api
provided
-
+
+ org.jboss.forge.addon
+ shell
+ forge-addon
+ provided
+
org.jboss.forge.addon
configuration-api
diff --git a/configuration/impl/src/main/java/org/jboss/forge/addon/configuration/ui/ConfigListCommand.java b/configuration/impl/src/main/java/org/jboss/forge/addon/configuration/ui/ConfigListCommand.java
new file mode 100644
index 0000000000..fa1a0c4e50
--- /dev/null
+++ b/configuration/impl/src/main/java/org/jboss/forge/addon/configuration/ui/ConfigListCommand.java
@@ -0,0 +1,103 @@
+package org.jboss.forge.addon.configuration.ui;
+
+import java.io.PrintStream;
+import java.util.Iterator;
+
+import javax.inject.Inject;
+
+import org.jboss.forge.addon.configuration.Configuration;
+import org.jboss.forge.addon.configuration.facets.ConfigurationFacet;
+import org.jboss.forge.addon.projects.Project;
+import org.jboss.forge.addon.projects.ProjectFactory;
+import org.jboss.forge.addon.projects.Projects;
+import org.jboss.forge.addon.shell.Shell;
+import org.jboss.forge.addon.shell.ui.AbstractShellCommand;
+import org.jboss.forge.addon.ui.context.UIBuilder;
+import org.jboss.forge.addon.ui.context.UIContext;
+import org.jboss.forge.addon.ui.context.UIExecutionContext;
+import org.jboss.forge.addon.ui.metadata.UICommandMetadata;
+import org.jboss.forge.addon.ui.result.Result;
+import org.jboss.forge.addon.ui.result.Results;
+import org.jboss.forge.addon.ui.util.Categories;
+import org.jboss.forge.addon.ui.util.Metadata;
+
+
+public class ConfigListCommand extends AbstractShellCommand
+{
+
+ @Override
+ public UICommandMetadata getMetadata(UIContext context)
+ {
+ return Metadata.from(super.getMetadata(context), getClass()).category(Categories.create("Configuration")).name("Config: List");
+ }
+
+ @Override
+ public void initializeUI(UIBuilder builder) throws Exception
+ {
+ }
+
+ @Inject
+ private Configuration userConfig;
+
+ @Inject
+ private ProjectFactory projectFactory;
+
+ @Override
+ public Result execute(UIExecutionContext context) throws Exception
+ {
+ Shell shell = (Shell) context.getUIContext().getProvider();
+ PrintStream out = shell.getOutput().out();
+
+ Project project = Projects.getSelectedProject(projectFactory, context.getUIContext());
+ Configuration projectConfig = null;
+
+ if (project != null)
+ {
+ projectConfig = project.getFacet(ConfigurationFacet.class).getConfiguration();
+ }
+
+ Iterator> userConfigKeys = userConfig.getKeys();
+
+ while (userConfigKeys.hasNext())
+ {
+ Object key = userConfigKeys.next();
+
+ if (key != null)
+ {
+ out.print(key.toString());
+ out.print("=");
+
+ out.print("user: [" + userConfig.getProperty(key.toString()) + "]");
+ if (projectConfig != null)
+ {
+ out.print(", project: ");
+ Object value = projectConfig.getProperty(key.toString());
+ if (value != null)
+ {
+ out.print("[" + value.toString() + "] ");
+ }
+ else
+ out.print("[]");
+ }
+ }
+ out.println();
+ }
+
+ if (projectConfig != null)
+ {
+ Iterator> projectConfigKeys = projectConfig.getKeys();
+
+ while (projectConfigKeys.hasNext())
+ {
+ String key = projectConfigKeys.next().toString();
+ if (!userConfig.containsKey(key))
+ {
+ out.print(key.toString());
+ out.print("=project: [");
+ out.print(projectConfig.getProperty(key.toString()).toString() + "]");
+ }
+ }
+ }
+ return Results.success();
+ }
+}
diff --git a/configuration/pom.xml b/configuration/pom.xml
index 0781126956..ecd5725cd8 100644
--- a/configuration/pom.xml
+++ b/configuration/pom.xml
@@ -40,6 +40,13 @@
${project.version}
forge-addon
+
+ org.jboss.forge.addon
+ shell
+ ${project.version}
+ forge-addon
+ provided
+
diff --git a/configuration/tests/pom.xml b/configuration/tests/pom.xml
index ce66d28da1..55aac61667 100644
--- a/configuration/tests/pom.xml
+++ b/configuration/tests/pom.xml
@@ -42,5 +42,11 @@
arquillian-furnace-classpath
test
+
+ org.jboss.forge.addon
+ shell-test-harness
+ forge-addon
+ test
+
diff --git a/configuration/tests/src/test/java/org/jboss/forge/addon/configuration/ui/ConfigListCommandTest.java b/configuration/tests/src/test/java/org/jboss/forge/addon/configuration/ui/ConfigListCommandTest.java
new file mode 100644
index 0000000000..9d95e7f4c2
--- /dev/null
+++ b/configuration/tests/src/test/java/org/jboss/forge/addon/configuration/ui/ConfigListCommandTest.java
@@ -0,0 +1,129 @@
+package org.jboss.forge.addon.configuration.ui;
+
+import static org.hamcrest.CoreMatchers.containsString;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Inject;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.forge.addon.configuration.Configuration;
+import org.jboss.forge.addon.configuration.ConfigurationFactoryImpl;
+import org.jboss.forge.addon.configuration.facets.ConfigurationFacet;
+import org.jboss.forge.addon.projects.Project;
+import org.jboss.forge.addon.projects.ProjectFactory;
+import org.jboss.forge.addon.shell.test.ShellTest;
+import org.jboss.forge.arquillian.AddonDependency;
+import org.jboss.forge.arquillian.Dependencies;
+import org.jboss.forge.arquillian.archive.ForgeArchive;
+import org.jboss.forge.furnace.repositories.AddonDependencyEntry;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(Arquillian.class)
+public class ConfigListCommandTest
+{
+ @Deployment
+ @Dependencies({
+ @AddonDependency(name = "org.jboss.forge.addon:shell-test-harness"),
+ @AddonDependency(name = "org.jboss.forge.addon:configuration"),
+ @AddonDependency(name = "org.jboss.forge.addon:shell"),
+ @AddonDependency(name = "org.jboss.forge.addon:projects"),
+ @AddonDependency(name = "org.jboss.forge.addon:maven"),
+ })
+ public static ForgeArchive getDeployment()
+ {
+ ForgeArchive archive = ShrinkWrap
+ .create(ForgeArchive.class)
+ .addBeansXML()
+ .addAsAddonDependencies(
+ AddonDependencyEntry.create("org.jboss.forge.furnace.container:cdi"),
+ AddonDependencyEntry.create("org.jboss.forge.addon:configuration"),
+ AddonDependencyEntry.create("org.jboss.forge.addon:shell-test-harness"),
+ AddonDependencyEntry.create("org.jboss.forge.addon:projects"),
+ AddonDependencyEntry.create("org.jboss.forge.addon:shell")
+ );
+
+ return archive;
+ }
+
+ @Inject
+ private Configuration userConfig;
+
+ @Inject
+ private ShellTest test;
+
+ @Inject
+ private ProjectFactory projectFactory;
+
+
+ static
+ {
+ ConfigurationFactoryImpl.setupTemporaryUserConfig();
+ }
+
+ @Before
+ public void setUp() throws Exception
+ {
+ test.clearScreen();
+ }
+
+ @Test
+ public void testConfigList() throws Exception
+ {
+ addPropsToUserConfig();
+ test.execute("config-list", 5, TimeUnit.SECONDS);
+ Assert.assertThat(test.getStdOut(), containsString("key1=user: [userValue1]"));
+ Assert.assertThat(test.getStdOut(), containsString("key2=user: [userValue2]"));
+ }
+
+ @Test
+ public void testConfigListInProject() throws Exception
+ {
+ Project project = projectFactory.createTempProject();
+ Configuration projectConfig = project.getFacet(ConfigurationFacet.class).getConfiguration();
+ addPropsToProjectConfig(projectConfig);
+ test.getShell().setCurrentResource(project.getRootDirectory());
+ test.execute("config-list", 5, TimeUnit.SECONDS);
+ Assert.assertThat(test.getStdOut(), containsString("key2=project: [projectValue2]"));
+ Assert.assertThat(test.getStdOut(), containsString("key3=project: [projectValue3]"));
+ }
+
+ @Test
+ public void testMergedConfigList() throws Exception
+ {
+ addPropsToUserConfig();
+ Project project = projectFactory.createTempProject();
+ Configuration projectConfig = project.getFacet(ConfigurationFacet.class).getConfiguration();
+ addPropsToProjectConfig(projectConfig);
+ test.getShell().setCurrentResource(project.getRootDirectory());
+ test.execute("config-list", 5, TimeUnit.SECONDS);
+ Assert.assertThat(test.getStdOut(), containsString("key1=user: [userValue1]"));
+ Assert.assertThat(test.getStdOut(), containsString("key2=user: [userValue2], project: [projectValue2]"));
+ Assert.assertThat(test.getStdOut(), containsString("key3=project: [projectValue3]"));
+ }
+
+ private void addPropsToUserConfig()
+ {
+ userConfig.setProperty("key1", "userValue1");
+ userConfig.setProperty("key2", "userValue2");
+ }
+
+ private void addPropsToProjectConfig(Configuration projectConfig)
+ {
+ projectConfig.addProperty("key2", "projectValue2");
+ projectConfig.addProperty("key3", "projectValue3");
+ }
+
+ @After
+ public void tearDown() throws Exception
+ {
+ userConfig.clearProperty("key1");
+ userConfig.clearProperty("key2");
+ }
+}
\ No newline at end of file