Skip to content

Commit

Permalink
Fix FORGE-1500
Browse files Browse the repository at this point in the history
  • Loading branch information
adam-wyluda committed Feb 10, 2014
1 parent ac9a5a6 commit 37e02dc
Showing 1 changed file with 94 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@

import org.jboss.forge.addon.facets.Facet;
import org.jboss.forge.addon.facets.FacetFactory;
import org.jboss.forge.addon.projects.ProjectProvider;
import org.jboss.forge.addon.projects.ProvidedProjectFacet;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectAssociationProvider;
import org.jboss.forge.addon.projects.ProjectFacet;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.addon.projects.ProjectListener;
import org.jboss.forge.addon.projects.ProjectProvider;
import org.jboss.forge.addon.projects.ProvidedProjectFacet;
import org.jboss.forge.addon.projects.spi.ProjectCache;
import org.jboss.forge.addon.resource.DirectoryResource;
import org.jboss.forge.addon.resource.FileResource;
Expand Down Expand Up @@ -101,23 +101,7 @@ public boolean accept(Project type)
@Override
public Project findProject(FileResource<?> target)
{
Project result = null;
Imported<ProjectProvider> instances = registry.getServices(ProjectProvider.class);
for (ProjectProvider projectProvider : instances)
{
try
{
result = findProject(target, projectProvider);
}
finally
{
instances.release(projectProvider);
}

if (result != null)
break;
}
return result;
return findProject(target, (Predicate<Project>) null);
}

@Override
Expand All @@ -136,19 +120,26 @@ public Project findProject(FileResource<?> target, Predicate<Project> filter)

Project result = null;
Imported<ProjectProvider> instances = registry.getServices(ProjectProvider.class);
for (ProjectProvider projectProvider : instances)

try
{
try
for (DirectoryResource dir : allDirectoriesOnPath(fileToDir(target)))
{
result = findProject(target, projectProvider, filter);
for (ProjectProvider projectProvider : instances)
{
result = findProjectInDirectory(dir, projectProvider, filter);
}

if (result != null)
break;
}
finally
}
finally
{
for (ProjectProvider projectProvider : instances)
{
instances.release(projectProvider);
}

if (result != null)
break;
}

return result;
Expand All @@ -164,42 +155,85 @@ public Project findProject(FileResource<?> target, ProjectProvider projectProvid
}

Project result = null;
DirectoryResource r = (target instanceof DirectoryResource) ? (DirectoryResource) target : target
.getParent();
while (r != null && result == null)

Iterator<DirectoryResource> pathIterator = allDirectoriesOnPath(fileToDir(target)).iterator();
while (pathIterator.hasNext() && result == null)
{
Iterator<ProjectCache> cacheIterator = caches.iterator();
while (cacheIterator.hasNext() && result == null)
{
ProjectCache cache = cacheIterator.next();
try
{
result = cache.get(r);
if (result != null && !filter.accept(result))
result = null;
if (result != null)
break;
}
finally
{
caches.release(cache);
}
}
result = findProjectInDirectory(pathIterator.next(), projectProvider, filter);
}

return result;
}

/**
* Returns all directories on path starting from given directory up to the root.
*/
private List<DirectoryResource> allDirectoriesOnPath(DirectoryResource startingDir)
{
List<DirectoryResource> result = new ArrayList<>();

while (startingDir != null)
{
result.add(startingDir);
startingDir = startingDir.getParent();
}

return result;
}

/**
* Returns project residing in given directory, if no such is found then null is returned.
*/
private Project findProjectInDirectory(DirectoryResource target, ProjectProvider projectProvider,
Predicate<Project> filter)
{
Project result = null;

if (result == null && projectProvider.containsProject(r))
Iterator<ProjectCache> cacheIterator = caches.iterator();
while (cacheIterator.hasNext())
{
ProjectCache cache = cacheIterator.next();
try
{
result = projectProvider.createProject(r);
result = cache.get(target);
if (result != null && !filter.accept(result))
result = null;

if (result != null)
{
registerAvailableFacets(result);
cacheProject(result);
}
break;
}
finally
{
caches.release(cache);
}
}

r = r.getParent();
if (result == null && projectProvider.containsProject(target))
{
result = projectProvider.createProject(target);
if (result != null && !filter.accept(result))
result = null;

if (result != null)
{
registerAvailableFacets(result);
cacheProject(result);
}
}

return result;
}

private DirectoryResource fileToDir(FileResource<?> file)
{
DirectoryResource result = null;

if (file instanceof DirectoryResource)
{
result = (DirectoryResource) file;
}
else
{
result = file.getParent();
}

return result;
Expand All @@ -219,10 +253,13 @@ public Project createProject(DirectoryResource target, ProjectProvider projectPr
Assert.notNull(projectProvider, "Build system type must not be null.");

if (facetTypes != null)
Assert.isTrue(isBuildable(projectProvider, facetTypes),
"The provided build system [" + projectProvider.getType()
Assert.isTrue(
isBuildable(projectProvider, facetTypes),
"The provided build system ["
+ projectProvider.getType()
+ "] cannot create a project that requires facets of the following types: "
+ getMissingProvidedProjectFacets(projectProvider, getRequiredProvidedProjectFacets(facetTypes)));
+ getMissingProvidedProjectFacets(projectProvider,
getRequiredProvidedProjectFacets(facetTypes)));

Project result = projectProvider.createProject(target);
if (result != null)
Expand Down

0 comments on commit 37e02dc

Please sign in to comment.