Skip to content

Commit

Permalink
Add JavaResourceGenerator, and refactor ResourceFactory to select the…
Browse files Browse the repository at this point in the history
… most specialized resource type when performing generation
  • Loading branch information
lincolnthree committed Feb 20, 2013
1 parent 9779b47 commit 4ed74e8
Show file tree
Hide file tree
Showing 15 changed files with 154 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.jboss.forge.container.exception.ContainerException;
import org.jboss.forge.container.impl.AddonRepositoryImpl;
import org.jboss.forge.container.util.ClassLoaders;
import org.jboss.forge.container.util.Files;
import org.jboss.forge.container.util.Threads;
import org.jboss.forge.dependencies.spi.DependencyResolver;
import org.jboss.shrinkwrap.api.Archive;
Expand Down Expand Up @@ -162,7 +163,7 @@ public void start() throws LifecycleException
{
try
{
this.addonDir = File.createTempFile("forge-test-addon-dir", "");
this.addonDir = File.createTempFile("forge", "test-addon-dir");
System.out.println("Executing test case with addon dir [" + addonDir + "]");
this.repository = AddonRepositoryImpl.forDirectory(addonDir);
}
Expand All @@ -173,7 +174,7 @@ public void start() throws LifecycleException
try
{
runnable = new ForgeRunnable(addonDir, ClassLoader.getSystemClassLoader());
thread = new Thread(runnable, "Arq-Forge Runtime");
thread = new Thread(runnable, "Arquillian Forge Runtime");
thread.start();
}
catch (Exception e)
Expand All @@ -186,6 +187,7 @@ public void start() throws LifecycleException
public void stop() throws LifecycleException
{
this.runnable.stop();
Files.delete(addonDir, true);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* 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.container.util;

/**
* Defines a class as having a weight for ordering.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public interface Weighted
{
int DEFAULT = 0;
int HIGH = 1000;
int MEDIUM = 100;
int LOW = -100;

int priority();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* 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.container.util;

import java.util.Comparator;

/**
* Compares {@link Weighted} objects.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*
*/
public class WeightedComparator implements Comparator<Weighted>
{
public static final Comparator<Weighted> INSTANCE = new WeightedComparator();

private WeightedComparator()
{
}

@Override
public int compare(final Weighted left, final Weighted right)
{
if ((left == null) || (right == null))
{
return 0;
}
return ((Integer) left.priority()).compareTo(right.priority());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.parser.resources;
package org.jboss.forge.parser.java.resources;

import java.util.Collections;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.parser.resources;
package org.jboss.forge.parser.java.resources;

import java.util.Collections;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.parser.resources;
package org.jboss.forge.parser.java.resources;

import java.util.Collections;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.parser.resources;
package org.jboss.forge.parser.java.resources;

import java.util.ArrayList;
import java.util.Collections;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.parser.resources;
package org.jboss.forge.parser.java.resources;

import java.io.File;
import java.io.FileNotFoundException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.parser.resources;
package org.jboss.forge.parser.java.resources;

/**
* @author Rudy De Busscher Called for each Java file which is found in the project.
Expand Down
11 changes: 11 additions & 0 deletions parser-java/impl/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,17 @@
<groupId>org.jboss.forge</groupId>
<artifactId>parser-java-api</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.forge</groupId>
<artifactId>forge-addon-container-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.forge</groupId>
<artifactId>resources-api</artifactId>
<version>2.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.eclipse.tycho</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.jboss.forge.parser.java.resources;

import java.io.File;

import org.jboss.forge.container.services.Exported;
import org.jboss.forge.resource.Resource;
import org.jboss.forge.resource.ResourceFactory;
import org.jboss.forge.resource.ResourceGenerator;

@Exported
public class JavaResourceGenerator implements ResourceGenerator<JavaResource, File>
{
@Override
public boolean handles(Class<?> type, Object resource)
{
if (resource instanceof File && ((File) resource).getName().endsWith(".java"))
{
return true;
}
return false;
}

@Override
@SuppressWarnings("unchecked")
public <T extends Resource<File>> T getResource(ResourceFactory factory, Class<JavaResource> type, File resource)
{
return (T) new JavaResource(factory, resource);
}

@Override
public <T extends Resource<File>> Class<?> getResourceType(Class<JavaResource> type, File resource)
{
return JavaResource.class;
}
}
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

import static org.junit.Assert.*;
import java.io.File;

import javax.inject.Inject;

Expand All @@ -19,21 +19,22 @@
import org.jboss.forge.container.AddonDependency;
import org.jboss.forge.container.AddonId;
import org.jboss.forge.parser.JavaParser;
import org.jboss.forge.parser.java.resources.JavaResource;
import org.jboss.forge.resource.ResourceFactory;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class JavaParserResourcesTest
{

@Deployment
@Dependencies({
@Addon(name = "org.jboss.forge:parser-java", version = "2.0.0-SNAPSHOT"),
@Addon(name = "org.jboss.forge:resources", version = "2.0.0-SNAPSHOT")
@Addon(name = "org.jboss.forge:resources", version = "2.0.0-SNAPSHOT"),
@Addon(name = "org.jboss.forge:parser-java", version = "2.0.0-SNAPSHOT")
})
public static ForgeArchive getDeployment()
{
Expand All @@ -54,6 +55,11 @@ public static ForgeArchive getDeployment()
public void testJavaResourceCreation() throws Exception
{
JavaClass javaClass = JavaParser.create(JavaClass.class).setPackage("org.jboss.forge.test").setName("Example");
JavaResource resource = factory.create(JavaResource.class, File.createTempFile("forge", ".java"));
resource.createNewFile();
resource.setContents(javaClass);

Assert.assertEquals("Example", resource.getJavaSource().getName());
Assert.assertEquals("org.jboss.forge.test", resource.getJavaSource().getPackage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
package org.jboss.forge.resource;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;

import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
Expand Down Expand Up @@ -34,42 +36,62 @@ public class ResourceFactory
@SuppressWarnings({ "unchecked", "rawtypes" })
public <E, T extends Resource<E>> T create(final Class<T> type, final E underlyingResource)
{
T result = null;
synchronized (this)
{
List<Resource<?>> generated = new ArrayList<Resource<?>>();
for (ExportedInstance<ResourceGenerator> instance : getRegisteredResourceGenerators())
{
ResourceGenerator generator = instance.get();
if (generator.handles(type, underlyingResource))
{
if (type.isAssignableFrom(generator.getResourceType(type, underlyingResource)))
{
Resource<?> resource = generator.getResource(this, type, underlyingResource);
return (T) resource;
generated.add(generator.getResource(this, type, underlyingResource));
}
}
instance.release(generator);
}

/*
* Choose the resource that is most specialized. TODO This needs to handle forks in the type hierarchy.
*/
for (Resource<?> resource : generated)
{
if (result == null || result.getClass().isAssignableFrom(resource.getClass()))
result = (T) resource;
}
}
return null;
return result;
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public <E> Resource<E> create(E underlyingResource)
{
Resource<E> result = null;
synchronized (this)
{
List<Resource<?>> generated = new ArrayList<Resource<?>>();
for (ExportedInstance<ResourceGenerator> instance : getRegisteredResourceGenerators())
{
ResourceGenerator generator = instance.get();
if (generator.handles(Resource.class, underlyingResource))
{
Resource<?> resource = generator.getResource(this, Resource.class, underlyingResource);
return (Resource<E>) resource;
generated.add(generator.getResource(this, Resource.class, underlyingResource));
}
instance.release(generator);
}

/*
* Choose the resource that is most specialized. TODO This needs to handle forks in the type hierarchy.
*/
for (Resource<?> resource : generated)
{
if (result == null || result.getClass().isAssignableFrom(resource.getClass()))
result = (Resource<E>) resource;
}
}
return null;
return result;
}

@SuppressWarnings("rawtypes")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package org.jboss.forge.resource;


public interface ResourceGenerator<RESOURCETYPE, UNDERLYINGTYPE>
{
public boolean handles(Class<?> type, final Object resource);

public <T extends Resource<UNDERLYINGTYPE>> T getResource(final ResourceFactory factory, Class<RESOURCETYPE> type,
final UNDERLYINGTYPE resource);

public <T extends Resource<UNDERLYINGTYPE>> Class<?> getResourceType(Class<RESOURCETYPE> type, final UNDERLYINGTYPE resource);
public <T extends Resource<UNDERLYINGTYPE>> Class<?> getResourceType(Class<RESOURCETYPE> type,
final UNDERLYINGTYPE resource);

}

0 comments on commit 4ed74e8

Please sign in to comment.