Skip to content

Commit

Permalink
Corrections in calculating interfaces to be implemented by facade
Browse files Browse the repository at this point in the history
  • Loading branch information
vardlokkur committed Jan 12, 2017
1 parent d39c780 commit 393b60f
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 2 deletions.
5 changes: 3 additions & 2 deletions src/main/java/pl/ais/commons/bean/facade/Facade.java
Expand Up @@ -45,12 +45,13 @@ private static <T> Class<? super T> determineSuperclass(@Nonnull final Class<T>
public static <S, T extends S> S over(@Nonnull final T instance, final TraverseListener listener) {

// Create CGLIB Enhancer using the instance class as superclass of the proxy we intend to create, ...
final Class<? super T> superclass = determineSuperclass((Class<T>) instance.getClass());
final Class<T> instanceClass = (Class<T>) instance.getClass();
final Class<? super T> superclass = determineSuperclass(instanceClass);
final Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(superclass);

// ... specify set of interfaces to be implemented by the proxy, ...
enhancer.setInterfaces(determineInterfaces(superclass));
enhancer.setInterfaces(determineInterfaces(instanceClass));

// ... define the type of callback to be used, ...
enhancer.setCallbackType(DelegatingMethodInterceptor.class);
Expand Down
28 changes: 28 additions & 0 deletions src/test/java/pl/ais/commons/bean/domain/model/DefaultName.java
@@ -0,0 +1,28 @@
package pl.ais.commons.bean.domain.model;

/**
* @author Warlock, AIS.PL
* @since 1.3.3
*/
public final class DefaultName implements Name {

private final String firstName;

private final String lastname;

public DefaultName(final String firstName, final String lastname) {
this.firstName = firstName;
this.lastname = lastname;
}

@Override
public String getFirstName() {
return firstName;
}

@Override
public String getLastName() {
return lastname;
}

}
13 changes: 13 additions & 0 deletions src/test/java/pl/ais/commons/bean/domain/model/Name.java
@@ -0,0 +1,13 @@
package pl.ais.commons.bean.domain.model;

/**
* @author Warlock, AIS.PL
* @since 1.3.3
*/
public interface Name {

String getFirstName();

String getLastName();

}
32 changes: 32 additions & 0 deletions src/test/java/pl/ais/commons/bean/facade/FacadeExpectations.java
@@ -0,0 +1,32 @@
package pl.ais.commons.bean.facade;

import org.junit.Test;
import pl.ais.commons.bean.domain.model.DefaultName;
import pl.ais.commons.bean.domain.model.Name;

import static org.junit.Assert.fail;

/**
* Verifies {@link Facade} expectations.
*
* @author Warlock, AIS.PL
* @since 1.3.3
*/
public class FacadeExpectations {

/**
* Verifies if facade created for final class instance, implementing some i-face, will implement same i-face itself.
*/
@Test
public void shouldBeAssignableToImplementedIfaceForFinalClass() {
final Name name = new DefaultName("John", "Smith");
final TraverseListener traverseListener = new TraverseListener();

try {
final Name facade = Facade.over(name, traverseListener);
} catch (final ClassCastException exception) {
fail("Created facade does not implement desired i-face.");
}
}

}

0 comments on commit 393b60f

Please sign in to comment.