Advertisement
Guest User

Untitled

a guest
Oct 21st, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. abstract class AbstractEntity { /* shared implementation for all entities */ }
  2.  
  3. class EntityA extends AbstractEntity { /* specific members for this entity */ }
  4. class EntityB extends AbstractEntity { /* specific members for this entity */ }
  5.  
  6. abstract class AbstractEntityResource { /* base class for serializable entities */ }
  7.  
  8. class EntityAResource extends AbstractEntityResource { /* includes members of entityA that should be serialized */ }
  9. class EntityBResource extends AbstractEntityResource { /* includes members of entityB that should be serialized */ }
  10.  
  11. public interface TransformStrategy<S, T> {
  12. public T transform(S model);
  13. boolean canTransform(Class<?> clazz);
  14. }
  15.  
  16. public abstract class AbstractTransformStrategy<S, T> implements TransformStrategy<S, T> {
  17.  
  18. private final Class<? extends S> sourceClass;
  19.  
  20. public AbstractTransformStrategy(Class<? extends S> sourceClass) {
  21. this.sourceClass = sourceClass;
  22. }
  23.  
  24. @Override
  25. public boolean canTransform(Class<?> clazz) {
  26. return sourceClass.equals(clazz);
  27. }
  28. }
  29.  
  30. public abstract class AbstractModelTransformer<S, T> {
  31.  
  32. private final List<TransformStrategy<S, T>> transformStrategies;
  33.  
  34. protected AbstractModelTransformer(List<TransformStrategy<S, T>> transformStrategies) {
  35. this.transformStrategies = transformStrategies;
  36. }
  37.  
  38. public T transform(S model) {
  39. TransformStrategy<S, T> transformStrategy = transformStrategies.stream().filter(ts -> ts.canTransform(model.getClass())).findFirst().orElseThrow( () -> new IllegalStateException(String.format("No transformer supporting %s could be found", model.getClass().getSimpleName())));
  40. return transformStrategy.transform(model);
  41. }
  42. }
  43.  
  44. public class EntityATransformStrategy extends AbstractTransformStrategy<AbstractEntity, AbstractEntityResource> {
  45. public LengthConstraintTransformStrategy() {
  46. super(EntityA.class);
  47. }
  48.  
  49. @Override
  50. public AbstractEntityResource transform(AbstractEntity model) {
  51. return new LengthConstraintResource(((EntityA) model));
  52. }
  53. }
  54.  
  55. public class AbstractEntityModelTransformer extends AbstractModelTransformer<AbstractEntity, AbstractEntityResource> {
  56.  
  57. private static final List<TransformStrategy<AbstractEntity, AbstractEntityResource>> STRATEGIES = new ArrayList<>(
  58. Arrays.asList(
  59. new EntityATransformStrategy()
  60. )
  61. );
  62.  
  63. public AbstractEntityModelTransformer() {
  64. super(STRATEGIES);
  65. }
  66. }
  67.  
  68. abstract class Base { }
  69. class Concrete extends Base { }
  70.  
  71. interface Something<T> { /* some method */ }
  72. class Implementation implements Something<Concrete> { /* implementation */}
  73.  
  74. class Main {
  75. public static void main(String[] args) {
  76.  
  77. List<Something<Base>> list = new ArrayList<>();
  78.  
  79. // this fails although Base is the supertype of Concrete
  80. list.add(new Implementation());
  81. }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement