package com.webcohesion.enunciate.modules.jackson1.model;
import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.introspect.VisibilityChecker;
/**
* Jackson visibility checker settings for each of the accessor methods.
* It would be nice to use the standard Jackson checker directly
* ({@link VisibilityChecker.Std}).
* Unfortunately enough, it does not allow to <em>read</em> values stored in it.
*
* @author Martin Kacer
*/
public class AccessorVisibilityChecker {
private final Map<JsonMethod,Visibility> minLevels;
public static final JsonAutoDetect DEFAULT_VISIBILITY = VisibilityChecker.Std.class.getAnnotation(JsonAutoDetect.class);
public static final AccessorVisibilityChecker DEFAULT_CHECKER = new AccessorVisibilityChecker(DEFAULT_VISIBILITY);
private AccessorVisibilityChecker(Map<JsonMethod,Visibility> minLevels) {
this.minLevels = minLevels;
}
public AccessorVisibilityChecker(JsonAutoDetect annotation) {
this(createMap(annotation.getterVisibility(), annotation.isGetterVisibility(),
annotation.setterVisibility(), annotation.creatorVisibility(), annotation.fieldVisibility()));
}
public AccessorVisibilityChecker with(JsonAutoDetect annotation) {
return new AccessorVisibilityChecker(createMap(
(annotation.getterVisibility() == Visibility.DEFAULT ? DEFAULT_VISIBILITY : annotation).getterVisibility(),
(annotation.isGetterVisibility() == Visibility.DEFAULT ? DEFAULT_VISIBILITY : annotation).isGetterVisibility(),
(annotation.setterVisibility() == Visibility.DEFAULT ? DEFAULT_VISIBILITY : annotation).setterVisibility(),
(annotation.creatorVisibility() == Visibility.DEFAULT ? DEFAULT_VISIBILITY : annotation).creatorVisibility(),
(annotation.fieldVisibility() == Visibility.DEFAULT ? DEFAULT_VISIBILITY : annotation).fieldVisibility()));
}
public AccessorVisibilityChecker withVisibility(JsonMethod method, Visibility level) {
return new AccessorVisibilityChecker(changeMap(minLevels, method, level));
}
/**
* This should always return a non-null value for "normal" usage and accessor methods.
*/
public Visibility getVisibility(JsonMethod method) {
return minLevels.get(method);
}
private static Map<JsonMethod,Visibility> createMap(Visibility getterLevel, Visibility isGetterLevel,
Visibility setterLevel, Visibility creatorLevel, Visibility fieldLevel) {
EnumMap<JsonMethod, Visibility> levels = new EnumMap<JsonMethod, Visibility>(JsonMethod.class);
levels.put(JsonMethod.GETTER, getterLevel);
levels.put(JsonMethod.IS_GETTER, isGetterLevel);
levels.put(JsonMethod.SETTER, setterLevel);
levels.put(JsonMethod.CREATOR, creatorLevel);
levels.put(JsonMethod.FIELD, fieldLevel);
return Collections.unmodifiableMap(levels);
}
private static Map<JsonMethod,Visibility> changeMap(Map<JsonMethod,Visibility> original,
JsonMethod method, Visibility level) {
EnumMap<JsonMethod, Visibility> levels = new EnumMap<JsonMethod, Visibility>(JsonMethod.class);
if (method == JsonMethod.ALL) {
return createMap(level, level, level, level, level);
}
levels.putAll(original);
levels.put(method, level);
return Collections.unmodifiableMap(levels);
}
}