Skip to content

Commit

Permalink
Refactor ProjectType API to decouple ProjectFactory from UI
Browse files Browse the repository at this point in the history
  • Loading branch information
lincolnthree committed Apr 9, 2013
1 parent 08cfe03 commit 4220cae
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 72 deletions.
Expand Up @@ -13,7 +13,7 @@

/**
* Used to create new or obtain references to existing {@link Project} instances.
*
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
@Exported
Expand All @@ -31,15 +31,17 @@ public interface ProjectFactory
public Project findProject(final DirectoryResource target, Predicate<Project> filter);

/**
* Create a {@link Project} with the given {@link ProjectType} instances in the specified {@link DirectoryResource}.
* Create a {@link Project} in the specified {@link DirectoryResource}.
*/
public Project createProject(DirectoryResource projectDir);

/**
* Create a {@link Project} with the given {@link ProjectFacet} types in the specified {@link DirectoryResource}.
*/
public Project createProject(DirectoryResource targetDir, ProjectType... types);
public Project createProject(DirectoryResource targetDir, Iterable<Class<? extends ProjectFacet>> facetTypes);

/**
* Register a listener for project events
*
* @param listener
* @return
*/
public ListenerRegistration<ProjectListener> addProjectListener(ProjectListener listener);
}
Expand Up @@ -71,7 +71,13 @@ public boolean accept(Project type)
}

@Override
public Project createProject(DirectoryResource target, ProjectType... types)
public Project createProject(DirectoryResource projectDir)
{
return createProject(projectDir, null);
}

@Override
public Project createProject(DirectoryResource target, Iterable<Class<? extends ProjectFacet>> facetTypes)
{
Project result = null;
for (ExportedInstance<ProjectLocator> instance : registry.getExportedInstances(ProjectLocator.class))
Expand All @@ -82,29 +88,22 @@ public Project createProject(DirectoryResource target, ProjectType... types)
break;
}

if (result != null && types != null)
if (result != null && facetTypes != null)
{
for (ProjectType type : types)
for (Class<? extends ProjectFacet> facetType : facetTypes)
{
Iterable<Class<? extends ProjectFacet>> facetTypes = type.getRequiredFacets();
if (facetTypes != null)
ProjectFacet facet = registry.getExportedInstance(facetType).get();
facet.setOrigin(result);
if (!result.install(facet))
{
for (Class<? extends ProjectFacet> facetType : facetTypes)
{
ProjectFacet facet = registry.getExportedInstance(facetType).get();
facet.setOrigin(result);
if (!result.install(facet))
{
throw new IllegalStateException("Could not install Facet [" + facet + "] of type [" + facetType
+ "] into Project [" + result + "]");
}
}
throw new IllegalStateException("Could not install Facet [" + facet + "] of type [" + facetType
+ "] into Project [" + result + "]");
}
}
}

if (result != null)
{
// Notify listeners
fireProjectCreated(result);
}
return result;
Expand Down
Expand Up @@ -153,7 +153,18 @@ public Result execute(UIContext context) throws Exception

if (targetDir.mkdirs() || overwrite.getValue())
{
Project project = projectFactory.createProject(targetDir, type.getValue());
ProjectType value = type.getValue();

Project project = null;
if (value != null)
{
project = projectFactory.createProject(targetDir, value.getRequiredFacets());
}
else
{
project = projectFactory.createProject(targetDir);
}

if (project != null)
{
MetadataFacet metadataFacet = project.getFacet(MetadataFacet.class);
Expand All @@ -163,7 +174,7 @@ public Result execute(UIContext context) throws Exception
context.setAttribute(Project.class, project);
}
else
result = Results.fail("Could not create project of type: [" + type.getValue() + "]");
result = Results.fail("Could not create project of type: [" + value + "]");
}
else
result = Results.fail("Could not create target location: " + targetDir);
Expand Down
Expand Up @@ -7,6 +7,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

import java.io.File;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -19,7 +20,9 @@
import org.jboss.forge.arquillian.archive.ForgeArchive;
import org.jboss.forge.container.addons.AddonId;
import org.jboss.forge.container.repositories.AddonDependencyEntry;
import org.jboss.forge.container.util.Files;
import org.jboss.forge.resource.DirectoryResource;
import org.jboss.forge.resource.ResourceFactory;
import org.jboss.forge.ui.context.UIBuilder;
import org.jboss.forge.ui.context.UIContext;
import org.jboss.forge.ui.context.UIContextBase;
Expand All @@ -35,8 +38,8 @@ public class NewProjectWizardTest
{
@Deployment
@Dependencies({
@Addon(name = "org.jboss.forge:projects", version = "2.0.0-SNAPSHOT"),
@Addon(name = "org.jboss.forge:ui", version = "2.0.0-SNAPSHOT")
@Addon(name = "org.jboss.forge:projects", version = "2.0.0-SNAPSHOT"),
@Addon(name = "org.jboss.forge:ui", version = "2.0.0-SNAPSHOT")
})
public static ForgeArchive getDeployment()
{
Expand All @@ -55,6 +58,9 @@ public static ForgeArchive getDeployment()
@Inject
private NewProjectWizard command;

@Inject
private ResourceFactory factory;

@Test
public void testInjectionNotNull()
{
Expand Down Expand Up @@ -83,30 +89,41 @@ public UIContext getUIContext()
}
};

command.initializeUI(builder);
command.getNamed().setValue("test");
command.getTopLevelPackage().setValue("org.example");
File tempDir = File.createTempFile("forge", "projectTests");
tempDir.delete();

command.validate(new UIValidationContext()
try
{
@Override
public UIContext getUIContext()
{
return context;
}
command.initializeUI(builder);
command.getTargetLocation().setValue(factory.create(DirectoryResource.class, tempDir));
command.getNamed().setValue("test");
command.getTopLevelPackage().setValue("org.example");

@Override
public void addValidationError(InputComponent<?, ?> input, String errorMessage)
command.validate(new UIValidationContext()
{
}
});

DirectoryResource targetDirectory = command.getTargetLocation().getValue().getChildDirectory("test");

Assert.assertFalse(targetDirectory.exists());
command.execute(context);
Assert.assertTrue(targetDirectory.exists());

targetDirectory.delete(true);
@Override
public UIContext getUIContext()
{
return context;
}

@Override
public void addValidationError(InputComponent<?, ?> input, String errorMessage)
{
}
});

DirectoryResource targetDirectory = command.getTargetLocation().getValue().getChildDirectory("test");

Assert.assertFalse(targetDirectory.exists());
command.execute(context);
Assert.assertTrue(targetDirectory.exists());

targetDirectory.delete(true);
}
finally
{
Files.delete(tempDir, true);
}
}
}
Expand Up @@ -7,7 +7,6 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

import java.util.Collections;
import java.util.concurrent.atomic.AtomicBoolean;

import javax.inject.Inject;
Expand All @@ -23,13 +22,10 @@
import org.jboss.forge.container.spi.ListenerRegistration;
import org.jboss.forge.container.util.Predicate;
import org.jboss.forge.projects.Project;
import org.jboss.forge.projects.ProjectFacet;
import org.jboss.forge.projects.ProjectFactory;
import org.jboss.forge.projects.ProjectListener;
import org.jboss.forge.projects.ProjectType;
import org.jboss.forge.resource.DirectoryResource;
import org.jboss.forge.resource.ResourceFactory;
import org.jboss.forge.ui.wizard.UIWizardStep;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.junit.Assert;
import org.junit.Test;
Expand Down Expand Up @@ -89,27 +85,7 @@ public void projectCreated(Project project)
}
});
Assert.assertNotNull("Should not have returned a null listener registration", registration);
Project project = projectFactory.createProject(projectDir, new ProjectType()
{

@Override
public String getType()
{
return "Test Type";
}

@Override
public Class<? extends UIWizardStep> getSetupFlow()
{
return null;
}

@Override
public Iterable<Class<? extends ProjectFacet>> getRequiredFacets()
{
return Collections.emptySet();
}
});
Project project = projectFactory.createProject(projectDir);
registration.removeListener();
Assert.assertNotNull(project);
Assert.assertTrue("Listener was not called", projectSet.get());
Expand Down

0 comments on commit 4220cae

Please sign in to comment.