package com.fasterxml.classmate;
import java.io.Serializable;
import java.util.*;
import com.fasterxml.classmate.util.ClassKey;
Interface for object that can provide mix-ins to override annotations.
/**
* Interface for object that can provide mix-ins to override annotations.
*/
@SuppressWarnings("serial")
public abstract class AnnotationOverrides implements Serializable
{
/*
/**********************************************************************
/* Public API
/**********************************************************************
*/
Method called to find out which class(es) are to be used as source
for annotations to mix in for given type.
Returns: List of mix-in sources (starting with highest priority);
can be null or empty list if no mix-ins are to be used.
/**
* Method called to find out which class(es) are to be used as source
* for annotations to mix in for given type.
*
* @return List of mix-in sources (starting with highest priority);
* can be null or empty list if no mix-ins are to be used.
*/
public List<Class<?>> mixInsFor(Class<?> beanClass) {
return mixInsFor(new ClassKey(beanClass));
}
public abstract List<Class<?>> mixInsFor(ClassKey beanClass);
Method for constructing builder for creating simple overrides provider
that just uses direct assignments (target-to-override classes)
/**
* Method for constructing builder for creating simple overrides provider
* that just uses direct assignments (target-to-override classes)
*/
public static StdBuilder builder() {
return new StdBuilder();
}
/*
/**********************************************************************
/* Helper types
/**********************************************************************
*/
To make it easy to use simple override implementation (where overrides
are direct and explicit), here is a build that allow constructing
such override instance.
/**
* To make it easy to use simple override implementation (where overrides
* are direct and explicit), here is a build that allow constructing
* such override instance.
*/
public static class StdBuilder
{
protected final HashMap<ClassKey,List<Class<?>>> _targetsToOverrides = new HashMap<ClassKey,List<Class<?>>>();
public StdBuilder() { }
public StdBuilder add(Class<?> target, Class<?> mixin) {
return add(new ClassKey(target), mixin);
}
public StdBuilder add(ClassKey target, Class<?> mixin)
{
List<Class<?>> mixins = _targetsToOverrides.get(target);
if (mixins == null) {
mixins = new ArrayList<Class<?>>();
_targetsToOverrides.put(target, mixins);
}
mixins.add(mixin);
return this;
}
Method that will construct a AnnotationOverrides
instance using mappings that have been added using this builder /**
* Method that will construct a {@link AnnotationOverrides} instance using
* mappings that have been added using this builder
*/
public AnnotationOverrides build() {
return new StdImpl(_targetsToOverrides);
}
}
Simple implementation configured with explicit associations with
target class as key, and overrides as ordered list of classes
(with first entry having precedence over later ones).
/**
* Simple implementation configured with explicit associations with
* target class as key, and overrides as ordered list of classes
* (with first entry having precedence over later ones).
*/
public static class StdImpl extends AnnotationOverrides
{
protected final HashMap<ClassKey,List<Class<?>>> _targetsToOverrides;
public StdImpl(HashMap<ClassKey,List<Class<?>>> overrides) {
_targetsToOverrides = new HashMap<ClassKey,List<Class<?>>>(overrides);
}
@Override
public List<Class<?>> mixInsFor(ClassKey target) {
return _targetsToOverrides.get(target);
}
}
}