Skip to content

Commit

Permalink
Revert "Broken generics in Facet API"
Browse files Browse the repository at this point in the history
This reverts commit 87dcacd.
  • Loading branch information
lincolnthree committed Jun 13, 2013
1 parent 87dcacd commit 9bc667b
Show file tree
Hide file tree
Showing 18 changed files with 83 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,21 @@
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>, <a
* href="http://community.jboss.org/people/kenfinni">Ken Finnigan</a>
*/
public abstract class AbstractFacet<FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>>
implements Facet<FACETEDTYPE, FACETTYPE>, MutableOrigin<FACETEDTYPE, FACETTYPE>
public abstract class AbstractFacet<FACETED extends Faceted<?>> implements Facet<FACETED>, MutableOrigin<FACETED>
{
protected FACETEDTYPE origin;
protected FACETED origin;

@Override
public FACETEDTYPE getOrigin()
public FACETED getOrigin()
{
return this.origin;
}

/**
* Set the <FACETEDTYPE> origin on which this {@link Facet} will operate.
* Set the <FACETED> origin on which this {@link Facet} will operate.
*/
@Override
public void setOrigin(FACETEDTYPE origin)
public void setOrigin(FACETED origin)
{
this.origin = origin;
}
Expand Down Expand Up @@ -59,7 +58,7 @@ public boolean equals(final Object obj)
return false;
if (getClass() != obj.getClass())
return false;
AbstractFacet<?, ?> other = (AbstractFacet<?, ?>) obj;
AbstractFacet<?> other = (AbstractFacet<?>) obj;
if (origin == null)
{
if (other.origin != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
*
* @param <FACETTYPE> the base {@link Facet} type supported by this {@link Faceted} type.
*/
public abstract class AbstractFaceted<FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>>
implements MutableFaceted<FACETEDTYPE, FACETTYPE>
public abstract class AbstractFaceted<FACETTYPE extends Facet<?>> implements MutableFaceted<FACETTYPE>
{
private Set<FACETTYPE> facets = Collections.newSetFromMap(new ConcurrentHashMap<FACETTYPE, Boolean>());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,20 @@
* A {@link Facet} is an access point to common functionality, file manipulations, descriptors that extend a
* {@link Faceted} instance. When implementing this interface, consider extending {@link AbstractFacet} for convenience.
*
* @param <FACETEDTYPE> The {@link Faceted} type to which this {@link Facet} may attach.
* @param <FACETED> The {@link Faceted} type to which this {@link Facet} may attach.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
* @author <a href="http://community.jboss.org/people/kenfinni">Ken Finnigan</a>
*
* @see {@link AbstractFacet}
*/
@Exported
public interface Facet<FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>>
public interface Facet<FACETED extends Faceted<?>>
{
/**
* Return the {@link Faceted} instance on which this {@link Facet} operates.
*/
FACETEDTYPE getOrigin();
FACETED getOrigin();

/**
* Perform necessary setup for this {@link Facet} to be considered installed in the given {@link Faceted} instance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,32 +21,31 @@ public interface FacetFactory
*
* @throws FacetNotFoundException if no implementation can be found.
*/
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> FACETTYPE create(
Class<FACETTYPE> type) throws FacetNotFoundException;
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> FACET create(Class<FACET> type)
throws FacetNotFoundException;

/**
* Create a new instance of the given {@link Facet} type. If it is also an instance of {@link MutableOrigin}, then
* use the given origin instance as the {@link Facet#getOrigin()}.
*
* @throws FacetNotFoundException if no implementation can be found.
*/
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> FACETTYPE create(
Class<FACETTYPE> type, FACETEDTYPE origin) throws FacetNotFoundException;
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> FACET create(Class<FACET> type, E origin)
throws FacetNotFoundException;

/**
* Get all instantiable {@link Facet} instances implementing the given {@link Facet} type. Returns an empty
* {@link Iterable} if no matching implementations can be found.
*/
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> Iterable<FACETTYPE> createFacets(
Class<FACETTYPE> type);
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> Iterable<FACET> createFacets(Class<FACET> type);

/**
* Get all instantiable {@link Facet} instances implementing the given {@link Facet} type. If it is also an instance
* of {@link MutableOrigin}, then use the given origin instance as the {@link Facet#getOrigin()}. Returns an empty
* {@link Iterable} if no matching implementations can be found.
*/
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> Iterable<FACETTYPE> createFacets(
Class<FACETTYPE> type, FACETEDTYPE origin);
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> Iterable<FACET> createFacets(
Class<FACET> type, E origin);

/**
* Create and installs a new instance of the given {@link Facet} type.
Expand All @@ -56,8 +55,8 @@ public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends F
* @throws FacetNotFoundException if no implementation can be found.
* @throws IllegalStateException if installation failed
*/
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> FACETTYPE install(
Class<FACETTYPE> type, FACETEDTYPE origin) throws FacetNotFoundException;
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> FACET install(Class<FACET> type, E origin)
throws FacetNotFoundException;

/**
* Install a {@link Facet} instance into the given origin.
Expand All @@ -68,6 +67,6 @@ public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends F
*
* @return <code>true</code> if installation was successful; <code>false</code> if installation failed.
*/
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> boolean install(
FACETTYPE facet, FACETEDTYPE origin) throws IllegalArgumentException;
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> boolean install(FACET facet, E origin)
throws IllegalArgumentException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*
* @param <FACETTYPE> the base {@link Facet} type supported by this {@link Faceted} type.
*/
public interface Faceted<FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>, FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>>
public interface Faceted<FACETTYPE extends Facet<?>>
{
/**
* Return true if a facet of the given type is present; return false otherwise.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@
*
* @param <FACETTYPE> the base {@link Facet} type supported by this {@link MutableFaceted} type.
*/
public interface MutableFaceted<FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>>
extends Faceted<FACETTYPE, FACETEDTYPE>
public interface MutableFaceted<FACETTYPE extends Facet<?>> extends Faceted<FACETTYPE>
{
/**
* Install and register the given {@link Facet}. If the facet is already installed, return true.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public interface MutableOrigin<FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>>
extends Facet<FACETEDTYPE, FACETTYPE>
public interface MutableOrigin<FACETED extends Faceted<?>> extends Facet<FACETED>
{
/**
* Set the {@link Faceted} origin to which this {@link Facet} belongs. Should only be set once, since each
* {@link Faceted} instance receives its own unique instance of all compatible {@link Facet} types. This method must
* be called before invoking any operations on {@code this} instance.
*/
void setOrigin(FACETEDTYPE origin);
void setOrigin(FACETED origin);
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@
*/
package org.jboss.forge.addon.facets;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.inject.Inject;

import org.jboss.forge.addon.facets.constraints.FacetInspector;
import org.jboss.forge.furnace.addons.AddonRegistry;
import org.jboss.forge.furnace.services.ExportedInstance;
import org.jboss.forge.furnace.util.Assert;
Expand All @@ -27,51 +24,48 @@ public class FacetFactoryImpl implements FacetFactory
private AddonRegistry registry;

@Override
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> FACETTYPE create(
Class<FACETTYPE> type)
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> FACET create(Class<FACET> type)
{
Assert.notNull(type, "Facet type must not be null.");
ExportedInstance<FACETTYPE> instance = registry.getExportedInstance(type);
ExportedInstance<FACET> instance = registry.getExportedInstance(type);
if (instance == null)
throw new FacetNotFoundException("Could not find Facet of type [" + type.getName() + "]");
return instance.get();
}

@Override
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> FACETTYPE create(
Class<FACETTYPE> type, FACETEDTYPE origin)
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> FACET create(Class<FACET> type, E origin)
{
FACETTYPE instance = create(type);
FACET instance = create(type);
if (instance instanceof MutableOrigin)
((MutableOrigin<FACETEDTYPE, FACETTYPE>) instance).setOrigin(origin);
((MutableOrigin<E>) instance).setOrigin(origin);
else
throw new IllegalArgumentException("Facet type [" + type.getName() + "] does not support setting an origin.");
return instance;
}

@Override
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> Iterable<FACETTYPE> createFacets(
Class<FACETTYPE> type)
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> Iterable<FACET> createFacets(Class<FACET> type)
{
Assert.notNull(type, "Facet type must not be null.");
Set<ExportedInstance<FACETTYPE>> instances = registry.getExportedInstances(type);
Set<FACETTYPE> facets = new HashSet<FACETTYPE>(instances.size());
for (ExportedInstance<FACETTYPE> instance : instances)
Set<ExportedInstance<FACET>> instances = registry.getExportedInstances(type);
Set<FACET> facets = new HashSet<FACET>(instances.size());
for (ExportedInstance<FACET> instance : instances)
{
facets.add(instance.get());
}
return facets;
}

@Override
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> Iterable<FACETTYPE> createFacets(
Class<FACETTYPE> type, FACETEDTYPE origin)
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> Iterable<FACET> createFacets(
Class<FACET> type, E origin)
{
Iterable<FACETTYPE> facets = createFacets(type);
for (FACETTYPE facet : facets)
Iterable<FACET> facets = createFacets(type);
for (FACET facet : facets)
{
if (facet instanceof MutableOrigin)
((MutableOrigin<FACETEDTYPE, FACETTYPE>) facet).setOrigin(origin);
((MutableOrigin<E>) facet).setOrigin(origin);
else
throw new IllegalArgumentException("Facet type [" + type.getName()
+ "] does not support setting an origin.");
Expand All @@ -80,11 +74,10 @@ public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends F
}

@Override
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> FACETTYPE install(
Class<FACETTYPE> type, FACETEDTYPE origin)
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> FACET install(Class<FACET> type, E origin)
throws FacetNotFoundException
{
FACETTYPE facet = create(type, origin);
FACET facet = create(type, origin);
if (!install(facet, origin))
{
throw new IllegalStateException("Facet type [" + type.getName()
Expand All @@ -97,46 +90,30 @@ public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends F

@Override
@SuppressWarnings("unchecked")
public <FACETEDTYPE extends Faceted<FACETTYPE, FACETEDTYPE>, FACETTYPE extends Facet<FACETEDTYPE, FACETTYPE>> boolean install(
FACETTYPE facet, FACETEDTYPE origin)
public <FACET extends Facet<E>, E extends Faceted<? extends Facet<?>>> boolean install(FACET facet, E origin)
{
Assert.notNull(origin, "Facet instance must not be null.");
Assert.notNull(origin, "Origin instance must not be null.");

Faceted<FACETTYPE, FACETEDTYPE> faceted = (Faceted<FACETTYPE, FACETEDTYPE>) origin;
Faceted<FACET> faceted = (Faceted<FACET>) origin;
Assert.isTrue(faceted instanceof MutableFaceted, "The given origin [" + origin + "] is not an instance of ["
+ MutableFaceted.class.getName() + "], and does not support " + Facet.class.getSimpleName()
+ " installation.");

if (facet.getOrigin() == null && facet instanceof MutableOrigin)
{
((MutableOrigin<FACETEDTYPE, FACETTYPE>) facet).setOrigin(origin);
((MutableOrigin<E>) facet).setOrigin(origin);
}

Assert.isTrue(origin.equals(facet.getOrigin()), "The given origin [" + origin + "] is not an instance of ["
+ MutableFaceted.class.getName() + "], and does not support " + Facet.class.getSimpleName()
+ " installation.");

List<Class<FACETTYPE>> requiredFacets = FacetInspector.getRequiredFacets(facet.getClass());
List<Class<FACETTYPE>> facetsToInstall = new ArrayList<Class<FACETTYPE>>();
for (Class<FACETTYPE> requirement : requiredFacets)
{
if (!origin.hasFacet(requirement))
{
facetsToInstall.add(requirement);
}
}

for (Class<FACETTYPE> requirement : facetsToInstall)
{
install(requirement, origin);
}

boolean result = false;
if (faceted.hasFacet((Class<? extends FACETTYPE>) facet.getClass()))
if (faceted.hasFacet((Class<? extends FACET>) facet.getClass()))
result = true;
else
result = ((MutableFaceted<FACETEDTYPE, FACETTYPE>) faceted).install(facet);
result = ((MutableFaceted<FACET>) faceted).install(facet);
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public abstract class AbstractProject extends AbstractFaceted<ProjectFacet, Project> implements Project
public abstract class AbstractProject extends AbstractFaceted<ProjectFacet> implements Project
{
private final Map<Object, Object> attributes = new HashMap<Object, Object>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public interface Project extends Faceted<ProjectFacet, Project>
public interface Project extends Faceted<ProjectFacet>
{
/**
* Get a value from this project's internal attributes. If the value is not set, return <code>null</code> instead.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public interface ProjectFacet extends Facet<Project, ProjectFacet>
public interface ProjectFacet extends Facet<Project>
{
}
Loading

0 comments on commit 9bc667b

Please sign in to comment.